如何在不使用连接

时间:2016-08-01 17:48:07

标签: python numpy numba

我正在编写利用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:])))

1 个答案:

答案 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团队花了很少的时间来优化非数字用例,所以这并不令人惊讶。我对输入数组str1str2的确切形式有点不清楚,因此我无法准确保证代码适用于您的特定用例。