小编典典

增长numpy数字数组的最快方法

python

要求:

  • 我需要从数据中任意增加一个数组。
  • 我可以猜测大小(大约100-200),但不能保证每次都适合该数组
  • 一旦增长到最终大小,我就需要对其进行数值计算,因此我更希望最终使用二维numpy数组。
  • 速度至关重要。例如,对于300个文件之一,update()方法被称为4500万次(大约需要150秒),而finalize()方法被称为500k次(总共需要106s)……总共需要250s或者。

这是我的代码:

def __init__(self):
    self.data = []

def update(self, row):
    self.data.append(row)

def finalize(self):
    dx = np.array(self.data)

我尝试过的其他操作包括以下代码…但这速度会慢一些。

def class A:
    def __init__(self):
        self.data = np.array([])

    def update(self, row):
        np.append(self.data, row)

    def finalize(self):
        dx = np.reshape(self.data, size=(self.data.shape[0]/5, 5))

这是如何称呼它的示意图:

for i in range(500000):
    ax = A()
    for j in range(200):
         ax.update([1,2,3,4,5])
    ax.finalize()
    # some processing on ax

阅读 157

收藏
2020-12-20

共1个答案

小编典典

我尝试了一些不同的事情,并进行了时间安排。

import numpy as np
  1. 您提到的缓慢方法:(32.094秒)

    class A:
    
    def __init__(self):
        self.data = np.array([])
    
    def update(self, row):
        self.data = np.append(self.data, row)
    
    def finalize(self):
        return np.reshape(self.data, newshape=(self.data.shape[0]/5, 5))
    
  2. 常规ol Python列表:(0.308秒)

    class B:
    
    def __init__(self):
        self.data = []
    
    def update(self, row):
        for r in row:
            self.data.append(r)
    
    def finalize(self):
        return np.reshape(self.data, newshape=(len(self.data)/5, 5))
    
  3. 尝试在numpy中实现arraylist:(0.362秒)

    class C:
    
    def __init__(self):
        self.data = np.zeros((100,))
        self.capacity = 100
        self.size = 0
    
    def update(self, row):
        for r in row:
            self.add(r)
    
    def add(self, x):
        if self.size == self.capacity:
            self.capacity *= 4
            newdata = np.zeros((self.capacity,))
            newdata[:self.size] = self.data
            self.data = newdata
    
        self.data[self.size] = x
        self.size += 1
    
    def finalize(self):
        data = self.data[:self.size]
        return np.reshape(data, newshape=(len(data)/5, 5))
    

这就是我的计时方式:

x = C()
for i in xrange(100000):
    x.update([i])

因此,看起来常规的旧Python列表相当不错;)

2020-12-20