我正在编写利用Numba来编译我的python代码的代码。 该函数接收两个长度与输入相同的数组,随机选择一个切片点并返回一个元组,该元组由两个输入字符串的一部分组成的两个Frankenstein数组。 然而,Numba还不支持numpy.concatenate函数(不知道它是否会发生)。由于我不愿意放弃Numpy,有没有人知道在没有连接函数的情况下连接两个Numpy数组的高性能解决方案?
def randomSlice(str1, str2):
lenstr = len(str1)
rnd = np.random.randint(1, lenstr)
return (np.concatenate((str1[:rnd], str2[rnd:])), np.concatenate((str2[:rnd], str1[rnd:])))
答案 0 :(得分:1)
这可能对您有用:
import numpy as np
import numba as nb
@nb.jit(nopython=True)
def randomSlice_nb(str1, str2):
lenstr = len(str1)
rnd = np.random.randint(1, lenstr)
out1 = np.empty_like(str1)
out2 = np.empty_like(str1)
out1[:rnd] = str1[:rnd]
out1[rnd:] = str2[rnd:]
out2[:rnd] = str2[:rnd]
out2[rnd:] = str1[rnd:]
return (out1, out2)
在我的机器上,使用Numba 0.27并通过timeit
模块进行计时,以确保我不计算统计数据中的jit时间(或者您可以运行一次,然后计算后续呼叫时间) ,numba版本在各种大小的int或浮点数输入数组上提供了小但不可忽略的性能提升。如果数组的类型为|S1
,则numba明显变慢。 Numba团队花了很少的时间来优化非数字用例,所以这并不令人惊讶。我对输入数组str1
和str2
的确切形式有点不清楚,因此我无法准确保证代码适用于您的特定用例。