要求:
- 我需要从数据中增长一个任意大的数组。
- 我可以猜测大小(大约100-200),但不能保证数组每次都适合
- 一旦它增长到它的最终大小,我需要对它执行数值计算,所以我更喜欢最终得到一个2-D numpy数组。
- 速度是至关重要的。举个例子,对于300个文件中的一个,update()方法被调用了4500万次(大约需要150秒),finalize()方法被调用了50万次(总共需要106秒)......总共需要250秒左右。
下面是我的代码:
def __init__(self):
self.data = []
def update(self, row):
self.data.append(row)
def finalize(self):
dx = np.array(self.data)
我尝试的其他东西包括以下代码...但这是waaaay慢。
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
6条答案
按热度按时间pbgvytdp1#
我尝试了一些不同的东西,有时间。
1.你提到的方法很慢:(32.094秒)
1.常规ol Python列表:(0.308秒)
1.尝试在numpy中实现一个arraylist:(0.362秒)
我是这样计时的
因此,看起来常规的旧Python列表非常好;)
lvmkulzt2#
np.append()每次复制数组中的所有数据,但list的容量增加了一个因子(1.125)。list速度快,但内存使用量比array大。如果你关心内存,可以使用python标准库的array模块。
以下是关于此主题的讨论:
How to create a dynamic array
b0zn9rqh3#
使用Owen的文章中的类声明,这里是一个修改的定时,具有一些finalize的效果。
简而言之,我发现C类提供了一个比原始帖子中的方法快60倍的实现。
我使用的文件:
现在,生成的计时:
答:
B:
C:
类A被更新破坏,类B被终结破坏,类C在这两种情况下都是健壮的。
hvvq6cgz4#
在你用来终结的函数中有一个很大的性能差异。考虑下面的代码:
使用concatenate似乎比第一个版本快两倍,比第二个版本快10倍以上。
lyr7nygr5#
多维Numpy数组
除了Owen's和Prashant Kumar's的答案之外,这里还有一个使用多维numpy数组(aka. shape)的版本,它可以加快numpy解决方案的代码。如果你需要经常访问(
finalize()
)数据,这尤其有用。| 版本|普拉尚特·库马尔|row_length=1|row_length=5|
| --------------|--------------|--------------|--------------|
| A类- np.append|2.873秒|2.776秒|0.682秒|
| B类- python列表|6.693秒|80.868秒|22.012秒|
| C类-数组列表|0.095秒|0.180秒|0.043秒|
列
Prashant Kumar
是他在我的机器上执行的示例,以给予比较。row_length=5
是初始问题的示例。python list
的急剧增加来自{built-in method numpy.array}
,这意味着numpy需要更多的时间将多维列表转换为一维列表的数组,并在两者具有相同数字条目的情况下重塑它,例如np.array([[1,2,3]*5])
与np.array([1]*15).reshape((-1,3))
。这就是代码:
和另一个选项添加到post above from Luca Fiaschi。
我的计时结果是:
qv7cva1a6#
如果你想提高列表操作的性能,可以看看blist库。它是python列表和其他结构的优化实现。
我还没有基准测试,但他们页面上的结果似乎很有希望。