มีประสิทธิภาพเพียงพอ smooth scrolling numpy ค่างานผ่านทางหน้ากากตรรกะ

0

คำถาม

ฉันมีหน้ากากตรรกะกำลังกำหนดค่าปัญหาที่ต้องการมีประสิทธิภาพเพียงพอ smooth scrolling หน้ากากตรรกะดำเนินงานการ)กิบัติงานอยู่

มันเป็นหลายมิติหน้ากากและฉันกำลังใช้ einsum เพื่อประสบความสำเร็จในส่วนผลที่ตามแต่ที่ปฏิบัติการก็คือไม่มีประสิทธิภาพและฉันสงสัยว่าถ้าฉันสามารถการความช่วยเหลือนิดหน่กับมัน นี่คือบทของผมปัจจุบันทางออก:(ทั้งสอง mask, truth_value, false_value เป็นยัยทึ่มข้อมูลกับ dtype และรูปร่างตรงกับเพื่อนปัญหาของฉัน

mask = np.random.randn(1000, 50)> 0.5
truth_value = np.random.randn(50, 10)
false_value = np.random.randn(10)
objective = np.einsum('ij,jk->ijk', mask, truth_value) + np.einsum('ij,k->ijk', ~mask, false_value)

มันมีทางที่จะทำให้เร็วขึ้น objective ให้ mask, truth_value, false_value ?

ในขณะที่ฉันรออยู่ข้างนอคิดออกเป็นทางรวดเร็ว

objective = np.where(mask[...,np.newaxis], np.broadcast_to(truth_value, (1000, 50, 10)), np.broadcast_to(false_value,  (1000, 50, 10)))

แต่มันมีเร็วทางเลือก?

mask numpy python
2021-11-21 23:00:26
1

คำตอบที่ดีที่สุด

0

คุณสามารถใช้ Numba JIT ต้องทำอย่างนั้นมากกว่ามีประสิทธิภาพ

import numpy as np
import numba as nb

@nb.njit('float64[:,:,::1](bool_[:,::1], float64[:,::1], float64[::1])')
def blend(mask, truth_value, false_value):
    n, m = mask.shape
    l = false_value.shape[0]
    assert truth_value.shape == (m, l)
    result = np.empty((n, m, l), dtype=np.float64)
    for i in range(n):
        for j in range(m):
            if mask[i, j]:
                result[i, j, :] = truth_value[j, :]
            else:
                result[i, j, :] = false_value[:]
    return result

mask = np.random.randn(1000, 50) > 0.5
truth_value = np.random.randn(50, 10)
false_value = np.random.randn(10)
objective = blend(mask, truth_value, false_value)

คนของ computation objective คือ 4.8 ครั้งเร็ว ของเดอะแมชชีน

ถ้ามันเป็นยังเร็วไม่พอ,คุณสามารถพยายามที่จะ parallelize รหัสโดยใช้พารามิเตอร์ parallel=True และใช้ nb.prange แทนที่จะเป็น range ที่ฉันจากข่าวด้วย นี่อาจจะไม่เร็วขึ้นเนื่องจากมุมสูงเท่านั้นของการสร้างใหม่เธรด. ฉันเครื่อง(กับ 6 แกน)ที่คู่ขนานเวอร์ชั่นเป็น 7.4 ครั้งรวดเร็ว (การสร้างของเธรดข่าวค่อนข้างแพงมากเมื่อเทียบกับการประหารเวลา).

อีกคนเป็นไปได้ optimization คือต้องเขียนโดยตรงผลอยู่ในชนกำข้างหน้าของเวลา(นี่คือเดียวจะดีกว่าถ้าคุณเรียกฟังก์ชันนี้หลายครั้งด้วยเหมือนตารางคู่ลำดับขนาด).

นี่คือทั้งหมดนี้ timings ของเครื่อง:

np.einsum:         4.32 ms
np.where:          1.72 ms
numba sequential:  0.89 ms
numba parallel:    0.58 ms
2021-11-21 23:52:43

ขอบคุณ! นี่แน่อยู่แล้วเข้าชุดเหมาะเหม็งรวดเร็วกว่าของฉัน einsum ทางออก! นิดหน่อยเร็วกว่าของฉัน np.where +np.broadcast_to ดูจากทางออกหรอกนะ
yupbank

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................