Numpy 结构化数组性能
Numpy structured array performance
我有一个查找问题归结为以下情况。
三列正整数。对于某些值 i
,'column_3'
中的哪些值在 i
下方具有 'column_1'
中的值,在 i
上方具有 'column_2'
中的值?
import numpy as np
rows = 1e6
i = 5e8
ts = np.zeros((rows,), dtype=[('column_1','int64'),('column_2','int64'),('column_3','int64')])
ts['column_1'] = np.random.randint(low=0,high=1e9,size=rows)
ts['column_2'] = np.random.randint(low=0,high=1e9,size=rows)
ts['column_3'] = np.random.randint(low=0,high=1e9,size=rows)
这是我要优化的操作:
%%timeit
a = ts[(ts['column_1'] < i)&(ts['column_2'] > i)]['column_3']
有什么我忽略的可以使它更快的吗?
将不胜感激任何建议!!
在创建时也将您的 3 个数组分配给 A,B,C
:
In [3]: %%timeit
...: a = ts[(ts['column_1'] < i)&(ts['column_2'] > i)]['column_3']
...:
22.5 ms ± 838 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [4]: %%timeit
...: a = C[(A < i)&(B > i)]
...:
...:
9.36 ms ± 15 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
使用 a,b,c = ts['column_1'],ts['column_2'],ts['column_3']
介于两者之间。
这些是您可以玩的变体和时间。正如我所看到的,由于索引差异,这只是微小的差异。没有一个数量级的差异。
我有一个查找问题归结为以下情况。
三列正整数。对于某些值 i
,'column_3'
中的哪些值在 i
下方具有 'column_1'
中的值,在 i
上方具有 'column_2'
中的值?
import numpy as np
rows = 1e6
i = 5e8
ts = np.zeros((rows,), dtype=[('column_1','int64'),('column_2','int64'),('column_3','int64')])
ts['column_1'] = np.random.randint(low=0,high=1e9,size=rows)
ts['column_2'] = np.random.randint(low=0,high=1e9,size=rows)
ts['column_3'] = np.random.randint(low=0,high=1e9,size=rows)
这是我要优化的操作:
%%timeit
a = ts[(ts['column_1'] < i)&(ts['column_2'] > i)]['column_3']
有什么我忽略的可以使它更快的吗? 将不胜感激任何建议!!
在创建时也将您的 3 个数组分配给 A,B,C
:
In [3]: %%timeit
...: a = ts[(ts['column_1'] < i)&(ts['column_2'] > i)]['column_3']
...:
22.5 ms ± 838 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [4]: %%timeit
...: a = C[(A < i)&(B > i)]
...:
...:
9.36 ms ± 15 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
使用 a,b,c = ts['column_1'],ts['column_2'],ts['column_3']
介于两者之间。
这些是您可以玩的变体和时间。正如我所看到的,由于索引差异,这只是微小的差异。没有一个数量级的差异。