首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Numpy在矢量化之后也显得很慢?

为什么Numpy在矢量化之后也显得很慢?
EN

Stack Overflow用户
提问于 2020-06-14 22:06:49
回答 1查看 54关注 0票数 0

作为练习的一部分,我在Numpy中实现了一个多项式类。我还使用标准Python列表和循环创建了另一个类,我在下面添加了这个类。

代码语言:javascript
复制
class Polynomial: # Implemented with Numpy
  '''
  This class is implementing a polynomial.

  Instance variable --> coefficients which contains the coeff of the polynomial.

  Methods:
  __init__ initializes the class.
  __call__ returns value of the polynomial given value of x
  derivative takes derivative of the polynomial and returns the new coefficients.
  '''
  def __init__(self, coefficients):
    self.coefficients = coefficients

  def __call__(self, x):
    polynomial_value = 0
    X = np.ones(len(self.coefficients))
    X[1:] = x
    return np.cumprod(X) @ self.coefficients

  def derivative(self):
    n = len(self.coefficients)
    new_coeff = self.coefficients[1:] * np.cumsum(np.ones(n-1))
    self.coefficients = new_coeff
    return self.coefficients 
代码语言:javascript
复制
class Polynomial: # Implemented without Numpy
  def __init__(self, coefficients):
    self.coefficients = coefficients

  def __call__(self, x):
    polynomial_value = 0
    for i in range(len(self.coefficients)):
      polynomial_value += self.coefficients[i]*(x**i)
    return polynomial_value

  def derivative(self):
    n = len(self.coefficients)
    new_coeff=[]
    for i in range(1,n):                  # Note we are dropping a0 and thus we
      new_coeff.append(self.coefficients[i]*i)  # are starting from 1
    self.coefficients = new_coeff
    return self.coefficients 

我使用以下例程测试了这2段代码:

  1. Numpy

代码语言:javascript
复制
%%timeit
import random
#Runtime on polynomial class
N = 10000
for i in range(1,N):
  coeff = np.random.randint(0, 100, size = 10)
  my_poly = Polynomial(coeff)
  x = random.randint(0,100)
  my_poly(x)

  1. 标准Python列表&用于循环

代码语言:javascript
复制
%%timeit
import random
#Runtime on polynomial class
N = 10000
for i in range(1,N):
  coeff = random.sample(range(0, 100), 10)
  my_poly = Polynomial(coeff)
  x = random.randint(0,100)
  my_poly(x)

第一次实施时间(Numpy)为249 ms,第二次实施时间为153 ms。

为什么是这种情况?在定义类或测试类时,我是否错误地实现了矢量化?还是还发生了什么事?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-14 22:26:02

这是因为你这样做的小方程,只有10个系数。我运行了100个系数的代码(即一个99度的方程),而numpy的运行时间是250 ms,而Python列表的运行时间是8.23秒。希望这能消除你的疑虑

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62378784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档