ฉันจะระบุสิ่งอันดับในลายเซ็น Numba Vectorize ได้อย่างไร
ในฟังก์ชัน numba.vectorize
คุณไม่สามารถใช้สิ่งอันดับได้ นั่นเป็นเพราะว่า vectorize
ทำเวคเตอร์โค้ดสำหรับอาร์เรย์ประเภทเหล่านี้
ดังนั้นการใช้ลายเซ็น float, float, tuple
จะสร้างฟังก์ชันที่คาดว่าจะมีอาร์เรย์สองตัวที่มีโฟลตและอีกหนึ่งอาร์เรย์ที่มีสิ่งอันดับ ปัญหาคือไม่มี dtype สำหรับอาร์เรย์ที่มี tuples - มันสามารถทำงานได้หากคุณใช้อาร์เรย์ที่มีโครงสร้างแทนอาร์เรย์ที่มี tuples แต่ฉันไม่ได้ลอง
ฉันจะระบุสิ่งอันดับในลายเซ็น Numba jit
ได้อย่างไร
วิธีที่ถูกต้องในการระบุ UniTuple
ในลายเซ็น numba คือการใช้ numba.types.containers.UniTuple
ในกรณีของคุณ:
nb.types.containers.UniTuple(nb.types.float64, 9)
ดังนั้นลายเซ็นที่ถูกต้องจะเป็นดังนี้:
import numba as nb
@nb.njit(
nb.types.float64(
nb.types.float64,
nb.types.float64,
nb.types.containers.UniTuple(nb.types.float64, 9)))
def func(f1, f2, ftuple):
# ...
return f1
ฉันมักจะหลีกเลี่ยงการพิมพ์ฟังก์ชัน numba ของฉันอย่างชัดเจน แต่เมื่อฉันทำ ฉันพบว่าการใช้ numba.typeof
มีประโยชน์มาก ตัวอย่างเช่น:
>>> nb.typeof((1.0, ) * 9)
tuple(float64 x 9)
>>> type(nb.typeof((1.0, ) * 9))
numba.types.containers.UniTuple
>>> help(type(nb.typeof((1.0, ) * 9))) # I shortened the result:
Help on class UniTuple in module numba.types.containers:
class UniTuple(BaseAnonymousTuple, _HomogeneousTuple, numba.types.abstract.Sequence)
| UniTuple(*args, **kwargs)
|
| Type class for homogeneous tuples.
|
| Methods defined here:
|
| __init__(self, dtype, count)
| Initialize self. See help(type(self)) for accurate signature.
ข้อมูลทั้งหมดก็อยู่ที่นั่น: มันคือ numba.types.containes.UniTuple
และคุณยกตัวอย่างด้วยอาร์กิวเมนต์สองตัว นั่นคือ dtype
(ในที่นี้คือ float64
) และตัวเลข (ในกรณีนี้คือ 9
)
ในกรณีที่คุณต้องการสร้างเวคเตอร์บนอาร์เรย์โฟลตเท่านั้น
หากคุณไม่ต้องการสร้างเวกเตอร์ให้กับฟังก์ชันสำหรับอาร์กิวเมนต์ tuple คุณสามารถสร้างฟังก์ชัน vectorized ภายในฟังก์ชันอื่นแล้วเรียกมันที่นั่น:
import numba as nb
import numpy as np
def func(E, L, fparams):
@nb.vectorize(['float64(float64, float64)'])
def fn_vec(e, l):
return e + l + fparams[1] # just to illustrate that the tuple is available
return fn_vec(E, L)
สิ่งนี้ทำให้ทูเพิลพร้อมใช้งานภายในฟังก์ชัน vectorize
d อย่างไรก็ตาม มันจะต้องสร้างฟังก์ชันภายในและคอมไพล์มันทุกครั้งที่คุณเรียกใช้ฟังก์ชันภายนอก ดังนั้นนี่อาจจะช้ากว่าจริงๆ ฉันไม่แน่ใจด้วยว่าจะใช้ได้กับ target="cuda"
คุณอาจต้องทดสอบด้วยตัวเอง
person
MSeifert
schedule
20.04.2019