【发布时间】:2014-10-12 06:39:37
【问题描述】:
这是我的 Python 代码:
X = [[0] * 1000] * 100
start = time()
for x in xrange(100):
for i in xrange(len(X)):
for j in xrange(len(X[i])):
X[i][j] += 1
print time() - start
我的 Cython 代码是一样的:
X = [[0] * 1000] * 100
start = time()
for x in xrange(100):
for i in xrange(len(X)):
for j in xrange(len(X[i])):
X[i][j] += 1
print time() - start
输出:
- Python 成本:2.86 秒
- Cython 消耗:0.41 秒
还有其他更快的方法在 Python 或 Cython 中执行上述操作吗?
更新:有什么方法可以创建高度索引性能接近 C/C++ 中的数组 int X[][] 的二维数组 X?
目前我正在考虑使用 Python C API 来完成这项工作。
还有一件事,一个 numpy 数组做同样的事情,但比纯 Python 和 Cython 中的列表慢得多(70 秒)。
Python:
X = np.zeros((100,1000),dtype=np.int32)
start = time()
for x in xrange(100):
for i in xrange(len(X)):
for j in xrange(len(X[i])):
X[i][j]+=1
如果对数值数组进行大量访问,哪种方法最好?
【问题讨论】:
-
你能用
numpy显示代码吗? -
上一个关于为什么它更快以及为速度付出代价的问题stackoverflow.com/questions/2697275/… 利息
-
@kroolik 添加了 numpy 数组代码
-
numpy 如果按预期使用会非常快,即通过编写 vectorized 代码。您的 numpy 示例可以简单地写为
Z = np.zeros((100, 1000), np.int32); X += 1(或者更简单,写为np.ones((100, 1000), np.int32)),这应该非常快(我机器上的就地添加约85us)。如果您发布您正在尝试优化的实际功能,那么我们很有可能可以帮助您编写矢量化版本。 -
我并不感到惊讶——实际上没有一个代码是矢量化的!不是数组容器本身更快(访问单个元素实际上比使用列表慢),而是它允许您一次将操作应用于多个数组元素,从而避免在 Python 中循环遍历元素。要充分利用 numpy,您确实必须停止将数组视为嵌套列表,并了解向量化操作的概念 (see here for a tutorial)。
标签: python performance list numpy cython