mat*_*guy 7 python performance zip numpy list-comprehension
我有两个端点数组,如下所示:
t1 = np.array([0,13,22,...,99994])
t2 = np.array([4,14,25,...,99998])
Run Code Online (Sandbox Code Playgroud)
我正在寻找最有效的方法来生成如下所示的输出:
np.array([0,1,2,3,4,13,14,22,23,24,25,...,99994,99995,99996,99997,99998])
Run Code Online (Sandbox Code Playgroud)
一种方法是这样的:
np.array([i for a, b in zip(t1, t2) for i in range(a, b + 1)])
Run Code Online (Sandbox Code Playgroud)
这个解决方案很慢,我确信它仍然可以通过完全用 Numpy 中的一些函数完全替换 zip 和列表理解组合来大大改进,只是我不知道如何。你们能告诉我最有效的方法吗?
提前谢谢你们
生成这两个数组的代码:
import numpy as np
m =10000
Z = np.arange(0,10*m,10)
t1 = np.random.randint(5, size =m ) + Z
t2 =np.random.randint(5,size = m) + 5 + Z
Run Code Online (Sandbox Code Playgroud)
这是一种使用的高性能方法numba
:
from numba import njit
@njit
def n_ranges_nb(t1, t2):
a = np.arange(np.max(t2)+1)
n = (t2 - t1).sum()
out = np.zeros(n)
l, l_old = 0, 0
for i,j in zip(t1, t2):
l += j-i
out[l_old:l] = a[i:j]
l_old = l
return out
Run Code Online (Sandbox Code Playgroud)
使用与上述相同的值进行检查:
t1 = np.array([0,13,22])
t2 = np.array([4,14,25])
n_ranges_nb(t1, t2+1)
# array([ 0., 1., 2., 3., 4., 13., 14., 22., 23., 24., 25.])
Run Code Online (Sandbox Code Playgroud)
让我们检查一下时间:
d = 100
perfplot.show(
setup=lambda n: np.cumsum(np.random.randint(0, 50, n)),
kernels=[
lambda x: np.array([i for a, b in zip(x,x+d) for i in range(a,b+1)]),
lambda x: n_ranges_nb(x, x+d+1),
lambda x: create_ranges(x, x+d+1) # (from the dupe)
],
labels=['nested-list-comp', 'n_ranges_nb', 'create_ranges'],
n_range=[2**k for k in range(0, 18)],
xlabel='N'
)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1379 次 |
最近记录: |