Python-pypy:绝对数组/向量差的有效和

Python-pypy:绝对数组/向量差的有效和,python,performance,numpy,vector,pypy,Python,Performance,Numpy,Vector,Pypy,我正试图减少我的脚本的计算时间,它是用pypy运行的。 它必须为大量列表/向量/数组计算绝对差的成对和。 输入向量的长度非常小,介于10到500之间。 到目前为止,我测试了三种不同的方法: 1) 朴素的方法,以列表形式输入: def std_sum(v1, v2): distance = 0.0 for (a,b) in izip(v1, v2): distance += math.fabs(a-b) return distance lzi = lambda v1, v2: red

我正试图减少我的脚本的计算时间,它是用pypy运行的。 它必须为大量列表/向量/数组计算绝对差的成对和。 输入向量的长度非常小,介于10到500之间。 到目前为止,我测试了三种不同的方法:

1) 朴素的方法,以列表形式输入:

def std_sum(v1, v2):
distance = 0.0
for (a,b) in izip(v1, v2):
     distance += math.fabs(a-b)
 return distance
lzi = lambda v1, v2: reduce(lambda s, (a,b):s + math.fabs(a-b), izip(v1, v2), 0)
def lmd_sum(v1, v2):
    return lzi(v1, v2)
2) 使用lambdas和reduce,以列表形式输入:

def std_sum(v1, v2):
distance = 0.0
for (a,b) in izip(v1, v2):
     distance += math.fabs(a-b)
 return distance
lzi = lambda v1, v2: reduce(lambda s, (a,b):s + math.fabs(a-b), izip(v1, v2), 0)
def lmd_sum(v1, v2):
    return lzi(v1, v2)
3) 使用numpy,输入为numpy.array:

def np_sum(v1, v2):
    return np.sum(np.abs(v1-v2))
在我的机器上,使用itertools.combinations_中的pypy和pairs进行替换 在500个这样的列表中,前两种方法非常相似(大约5秒), 而numpy方法要慢得多,大约需要12秒

有没有更快的计算方法?从文本中读取和解析列表 文件和增加的预处理时间不会有问题(例如创建numpy数组)。 这些列表包含浮点数,并且大小相等,这是事先知道的

可以找到我用于“基准测试”的脚本和一些示例数据

有没有更快的计算方法?列表是从文本文件读取和解析的,增加预处理时间不会有问题(例如创建numpy数组)。这些列表包含浮点数,并且大小相等,这是事先知道的

PyPy非常擅长优化列表访问,所以您可能应该坚持使用列表

帮助PyPy优化的一件事是确保列表始终只有一种类型的对象。也就是说,如果你从一个文件中读取字符串,不要把它们放在一个列表中,然后将它们解析成浮动。相反,创建带有浮点数的列表,例如在读取每个字符串后立即对其进行解析。同样,千万不要尝试预先分配列表,尤其是使用
[None,]*N
,否则PyPy将无法预先分配列表

其次,尽可能少地迭代列表。您的
np_sum
函数将两个数组遍历三次(减法、abs、sum),除非PyPy注意到并能够对其进行优化。都是1。二,。按列表走一次,这样他们会更快

有没有更快的计算方法?列表是从文本文件读取和解析的,增加预处理时间不会有问题(例如创建numpy数组)。这些列表包含浮点数,并且大小相等,这是事先知道的

PyPy非常擅长优化列表访问,所以您可能应该坚持使用列表

帮助PyPy优化的一件事是确保列表始终只有一种类型的对象。也就是说,如果你从一个文件中读取字符串,不要把它们放在一个列表中,然后将它们解析成浮动。相反,创建带有浮点数的列表,例如在读取每个字符串后立即对其进行解析。同样,千万不要尝试预先分配列表,尤其是使用
[None,]*N
,否则PyPy将无法预先分配列表

其次,尽可能少地迭代列表。您的
np_sum
函数将两个数组遍历三次(减法、abs、sum),除非PyPy注意到并能够对其进行优化。都是1。二,。按列表走一次,这样他们会更快

有没有更快的计算方法?列表是从文本文件读取和解析的,增加预处理时间不会有问题(例如创建numpy数组)。这些列表包含浮点数,并且大小相等,这是事先知道的

PyPy非常擅长优化列表访问,所以您可能应该坚持使用列表

帮助PyPy优化的一件事是确保列表始终只有一种类型的对象。也就是说,如果你从一个文件中读取字符串,不要把它们放在一个列表中,然后将它们解析成浮动。相反,创建带有浮点数的列表,例如在读取每个字符串后立即对其进行解析。同样,千万不要尝试预先分配列表,尤其是使用
[None,]*N
,否则PyPy将无法预先分配列表

其次,尽可能少地迭代列表。您的
np_sum
函数将两个数组遍历三次(减法、abs、sum),除非PyPy注意到并能够对其进行优化。都是1。二,。按列表走一次,这样他们会更快

有没有更快的计算方法?列表是从文本文件读取和解析的,增加预处理时间不会有问题(例如创建numpy数组)。这些列表包含浮点数,并且大小相等,这是事先知道的

PyPy非常擅长优化列表访问,所以您可能应该坚持使用列表

帮助PyPy优化的一件事是确保列表始终只有一种类型的对象。也就是说,如果你从一个文件中读取字符串,不要把它们放在一个列表中,然后将它们解析成浮动。相反,创建带有浮点数的列表,例如在读取每个字符串后立即对其进行解析。同样,千万不要尝试预先分配列表,尤其是使用
[None,]*N
,否则PyPy将无法预先分配列表


其次,尽可能少地迭代列表。您的
np_sum
函数将两个数组遍历三次(减法、abs、sum),除非PyPy注意到并能够对其进行优化。都是1。二,。浏览一下列表,这样他们会更快。

你在使用Numpy吗?老实说,我不确定,我必须调查一下。然而,当我使用标准python运行“基准测试”时,性能上的差异也存在。你能发布你的计时代码吗?您是否也可以尝试求和(izip(v1,v2)中a,b的abs(a-b))?我有一种感觉,问题很可能是使用
itertools
而不是纯粹的Numpy解决方案。当我启动pypy shell时,导入Numpy并执行Numpy。它确实指向我安装的pypypy Numpy fork,所以我想我真的在使用Numpy。看看这个。我知道它不是pypy,但那些JIT编译器是专门为数值计算而设计的。。。所以也许你可以让我们加速