在我的代码中,我注意到将列表转换为数组需要花费大量时间。
我想知道是否有更快的方法可以将列表转换为python中的数组,这是我的三种尝试:
import numpy as np
from timeit import timeit
from array import array
added_data = range(100000)
def test1():
np.asarray(added_data, dtype=np.float16)
def test2():
np.array(added_data, dtype=np.float16)
def test3():
array('f', added_data)
print(timeit(test1,number=100))
print(timeit(test2,number=100))
print(timeit(test3,number=100))
换句话说:
输入:
输出:
答案 0 :(得分:1)
与您已经尝试过的简单明了的方法相比,没有一种更快的方法可以将值列表转换为数组。如果有更好的方法,那么numpy
的作者可能会在np.asarray
或np.array
构造函数本身中实现它。我还想指出,array.array
创建的对象要比numpy
函数复杂得多,所以它可能不是您想要的。
您可能能够提高程序整体性能的方法是避免首先创建列表。也许您可以使用np.loadtxt
或np.load
(取决于其格式)将文件中的外部数据直接读取到数组中。或者,也许您可以使用np.arange
之类的函数从头开始生成数组,而不是使用range
之类的普通Python函数(在Python 2中)返回列表。
答案 1 :(得分:0)
结果将相同:
from array import array
def test4() :
array = array('d')
for item in added_data: # comma, or other
array.append(item)
但是您可以尝试:
from array import array
def test5() :
dataset_array = array('d')
dataset_array.extend(added_data)
答案 2 :(得分:0)
将项目添加到numpy数组将导致性能问题。永远不要那样做。
替代品: 1-将项目添加到列表中,然后将该列表转换为numpy数组。
2-使用集合中的双端队列。这是最好的方法。
import collections
a = collections.deque([1,2,3,4])
a.append(5)