对于我的项目使用,我需要在二维数组中存储一定数量(~100x100)的浮点数。在函数计算期间,我需要读取和写入数组,因为函数确实是瓶颈(消耗 98% 的时间),我真的需要它快速。
我用 numpy 和 cython 做了一些实验:
import numpy
import time
cimport numpy
cimport cython
cdef int col, row
DTYPE = numpy.int
ctypedef numpy.int_t DTYPE_t
cdef numpy.ndarray[DTYPE_t, ndim=2] matrix_c = numpy.zeros([100 + 1, 100 + 1], dtype=DTYPE)
time_ = time.time()
for l in xrange(5000):
for col in xrange(100):
for row in xrange(100):
matrix_c[<unsigned int>row + 1][<unsigned int>col + 1] = matrix_c[<unsigned int>row][<unsigned int>col]
print "Numpy + cython time: {0}".format(time.time() - time_)
但我发现,尽管我做了所有尝试,使用 python 列表的版本仍然明显更快。
使用列表的代码:
matrix = []
for i in xrange(100 + 1):
matrix.append([])
for j in xrange(100 + 1):
matrix[i].append(0)
time_ = time.time()
for l in xrange(5000):
for col in xrange(100):
for row in xrange(100):
matrix[row + 1][col + 1] = matrix[row][col]
print "list time: {0}".format(time.time() - time_)
和结果:
list time: 0.0141758918762
Numpy + cython time: 0.484772920609
我做错了什么吗?如果没有,有什么可以帮助我改善结果的吗?