【发布时间】:2016-04-28 06:00:43
【问题描述】:
NumPy 数组在性能和易用性方面都非常出色(比列表更容易切片、索引)。
我尝试用NumPy structured array 而非dict 或NumPy arrays 构建数据容器。问题是性能要差得多。使用同质数据的坏率大约是 2.5 倍,对于异构数据来说大约是 32 倍(我说的是NumPy 数据类型)。
有没有办法加快结构化数组的速度?我尝试将内存顺序从“c”更改为“f”,但这没有任何影响。
这是我的分析代码:
import time
import numpy as np
NP_SIZE = 100000
N_REP = 100
np_homo = np.zeros(NP_SIZE, dtype=[('a', np.double), ('b', np.double)], order='c')
np_hetro = np.zeros(NP_SIZE, dtype=[('a', np.double), ('b', np.int32)], order='c')
dict_homo = {'a': np.zeros(NP_SIZE), 'b': np.zeros(NP_SIZE)}
dict_hetro = {'a': np.zeros(NP_SIZE), 'b': np.zeros(NP_SIZE, np.int32)}
t0 = time.time()
for i in range(N_REP):
np_homo['a'] += i
t1 = time.time()
for i in range(N_REP):
np_hetro['a'] += i
t2 = time.time()
for i in range(N_REP):
dict_homo['a'] += i
t3 = time.time()
for i in range(N_REP):
dict_hetro['a'] += i
t4 = time.time()
print('Homogeneous Numpy struct array took {:.4f}s'.format(t1 - t0))
print('Hetoregeneous Numpy struct array took {:.4f}s'.format(t2 - t1))
print('Homogeneous Dict of numpy arrays took {:.4f}s'.format(t3 - t2))
print('Hetoregeneous Dict of numpy arrays took {:.4f}s'.format(t4 - t3))
编辑:忘记输入我的计时号码:
Homogenious Numpy struct array took 0.0101s
Hetoregenious Numpy struct array took 0.1367s
Homogenious Dict of numpy arrays took 0.0042s
Hetoregenious Dict of numpy arrays took 0.0042s
Edit2:我用 timit 模块添加了一些额外的测试用例:
import numpy as np
import timeit
NP_SIZE = 1000000
def time(data, txt, n_rep=1000):
def intern():
data['a'] += 1
time = timeit.timeit(intern, number=n_rep)
print('{} {:.4f}'.format(txt, time))
np_homo = np.zeros(NP_SIZE, dtype=[('a', np.double), ('b', np.double)], order='c')
np_hetro = np.zeros(NP_SIZE, dtype=[('a', np.double), ('b', np.int32)], order='c')
dict_homo = {'a': np.zeros(NP_SIZE), 'b': np.zeros(NP_SIZE)}
dict_hetro = {'a': np.zeros(NP_SIZE), 'b': np.zeros(NP_SIZE, np.int32)}
time(np_homo, 'Homogeneous Numpy struct array')
time(np_hetro, 'Hetoregeneous Numpy struct array')
time(dict_homo, 'Homogeneous Dict of numpy arrays')
time(dict_hetro, 'Hetoregeneous Dict of numpy arrays')
结果:
Homogeneous Numpy struct array 0.7989
Hetoregeneous Numpy struct array 13.5253
Homogeneous Dict of numpy arrays 0.3750
Hetoregeneous Dict of numpy arrays 0.3744
运行之间的比率似乎相当稳定。使用这两种方法和不同大小的数组。
对于关闭情况,这很重要: 蟒蛇:3.4 NumPy:1.9.2
【问题讨论】:
-
由于这个问题询问的是 NumPy 的特定性能问题,而不是一般的批评,因此它已从 Code Review 迁移到 Stack Overflow。
-
如果你真的想使用结构化数组,我建议你试试pandas。
-
我在这里看到了相同的时间。至于
np_homovs.np_hetero,可能和对齐有关,因为np.int64作为第二个dtype并没有那么慢。 -
@MaxNoe。我在打开这个问题之前看到了它。但是我相信这不是一回事,因为我使用的是 1.9.2 并且问题刚刚出现在 1.10
标签: performance python-3.x numpy