4

我在初始化 4-D numpy 张量字典时遇到了性能问题。

我有一个系数名称列表:

cnames = ['CN', 'CM', 'CA', 'CY', 'CLN' ...];

那不是固定大小的(它取决于上面的代码)。对于每个系数,我必须生成一个零的 4-D 张量 [nalpha X nmach X nbeta X nalt](用于预分配目的),所以我这样做:

#Number of coefficients
numofc = len(cnames);

final_data = {};
#I have to generate <numofc> 4D matrixes
for i in range(numofc):
    final_data[cnames[i]]=n.zeros((nalpha,nmach,nbeta,nalt));

每个索引是 10 到 30 之间的整数。 每个索引是 100 到 200 之间的整数

这需要大约 4 分钟。我怎样才能加快速度?还是我做错了什么?

4

1 回答 1

6

您发布的代码不应花费 4 分钟来运行(除非cnames非常大或您的 RAM 非常少并且被迫使用交换空间)。

import numpy as np

cnames = ['CN', 'CM', 'CA', 'CY', 'CLN']*1000
nalpha,nmach,nbeta,nalt = 10,20,30,40
#Number of coefficients
numofc = len(cnames)

final_data = {}
#I have to generate <numofc> 4D matrixes
for i in range(numofc):
    final_data[cnames[i]]=np.zeros((nalpha,nmach,nbeta,nalt))

即使cnames有 5000 个元素,它也应该只需要几秒钟的时间:

% time test.py
real    0m4.559s
user    0m0.856s
sys 0m3.328s

语句末尾的分号表明您有其他语言的经验。小心将该语言中的命令逐行翻译成 NumPy/Python。在 NumPy 中编码就像在 C 中一样是缓慢的秘诀。

特别是,尽量避免逐个元素地更新数组中的元素。这在 C 中运行良好,但在 Python 中非常慢。NumPy 通过委托使用 Fortran 或 Cython 或 C 或 C++ 编码的函数来实现速度。通过逐个元素更新数组,您正在使用速度不那么快的 Python 循环。

相反,请尝试根据对整个数组(或至少是数组切片)的操作来重新表述您的计算。

我可能对问题的原因猜测太多了。您需要分析您的代码,然后,如果您需要更具体的帮助,请发布分析结果以及有问题的代码(以SSCCE的形式最有帮助)。

于 2013-04-20T13:52:42.250 回答