相关疑难解决方法(0)

numpy中不同矢量化方法的表现

我想在python中测试矢量化代码的性能:

import timeit
import numpy as np

def func1():
  x = np.arange(1000)
  sum = np.sum(x*2)
  return sum

def func2():
  sum = 0
  for i in xrange(1000):
    sum += i*2
  return sum

def func3():
  sum = 0
  for i in xrange(0,1000,4):
    x = np.arange(i,i+4,1)
    sum += np.sum(x*2)
  return sum

print timeit.timeit(func1, number = 1000)
print timeit.timeit(func2, number = 1000)
print timeit.timeit(func3, number = 1000)
Run Code Online (Sandbox Code Playgroud)

代码提供以下输出:

0.0105729103088
0.069864988327
0.983253955841
Run Code Online (Sandbox Code Playgroud)

第一和第二功能的性能差异并不令人惊讶.但我很惊讶第3个功能明显慢于其他功能.

我在C中的代码中比在Python中更熟悉,第三个函数更像C - 运行for循环并在每个循环中的一条指令中处理4个数字.根据我的理解,numpy调用C函数,然后在C中对代码进行矢量化.因此,如果是这种情况,我的代码也会一次传递4个数字到numpy.当我一次传递更多数字时,代码应该不会更好.那为什么它要慢得多呢?是因为调用numpy函数的开销?

再说,我即使摆在首位的第三个功能上来的原因是因为我担心大量内存分配的性能xfunc1.

我的担心有效吗?为什么以及如何改进它或为什么不改进?

提前致谢.

编辑:

出于好奇的缘故,虽然它打破了我创建第3版的最初目的,但我已经研究了roganjosh的建议,并尝试了以下编辑. …

python performance numpy vectorization

8
推荐指数
1
解决办法
848
查看次数

使用元素作为索引的函数创建一个numpy矩阵

如何创建一个numpy矩阵,其元素是其索引的函数?例如,乘法表:a[i,j] = i*j

Un-numpy和un-pythonic将创建一个零数组然后循环.

毫无疑问,有一种更好的方法可以做到这一点,没有循环.

然而,更好的是直接创建矩阵.

python numpy matrix

5
推荐指数
2
解决办法
1万
查看次数

标签 统计

numpy ×2

python ×2

matrix ×1

performance ×1

vectorization ×1