我有一个关于4-D numpy tensor词典的性能问题。
我有一个系数名称列表:
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分钟。我怎样才能加快这个速度?或者我做错了什么?
答案 0 :(得分:5)
您发布的代码不应该花费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循环速度不是很快。
相反,尝试根据整个数组(或至少是数组切片)的操作来重新计算您的计算。
我可能过多地猜测问题的原因。您需要profile your code,然后,如果您需要更具体的帮助,请发布个人资料的结果以及有问题的代码(最有帮助的是以SSCCE的形式)。