python中list.extend的替代方案/更快的方法?

python中list.extend的替代方案/更快的方法?,python,python-2.7,Python,Python 2.7,我有相当多的数据集要扩展 我想知道做这件事的另一种/更快的方法是什么 我尝试了iadd和extend,它们都需要相当长的时间来创建输出 from timeit import timeit raw_data = []; raw_data2 = []; added_data = range(100000) # .__iadd__ def test1(): for i in range(10): raw_data.__iadd__(added_data*i); #ext

我有相当多的数据集要扩展

我想知道做这件事的另一种/更快的方法是什么

我尝试了iadd和extend,它们都需要相当长的时间来创建输出

from timeit import  timeit

raw_data = [];
raw_data2 = [];
added_data = range(100000)

# .__iadd__
def test1():
    for i in range(10):
        raw_data.__iadd__(added_data*i);

#extend

def test2():
    for i in range(10):
        raw_data2.extend(added_data*i);


print(timeit(test1,number=2));
print(timeit(test2,number=2));

我觉得列表理解或数组映射可以回答我的问题…

如果您需要数据作为列表,那么没有什么可以获得的-list.extend和u iadd_uu在性能上非常接近-取决于您使用的数量,其中一个最快:

 import time
 added_data = range(1000000)
 tic = time.time()
 raw_data=[i for x in range(10) for i in added_data ]
 print raw_data
 print (str((time.time()- tic)*1000) + ' ms')
import timeit 
from itertools import repeat , chain 
raw_data = [] 
added_data = range(100000) # verify data : uncomment: range(5)

def iadd():
    raw_data = [] 
    for i in range(10):
        raw_data.__iadd__(added_data)
    # print(raw_data)

def extend():
    raw_data = [] 
    for i in range(10):
        raw_data.extend(added_data)
    # print(raw_data)

def tricked():
    raw_data = list(chain.from_iterable(repeat(added_data,10)))
    # print(raw_data)

for w,c in (("__iadd__",iadd),("  extend",extend),(" tricked",tricked)):
    print(w,end = " : ")
    print("{:08.8f}".format(timeit.timeit(c, number = 200)))
输出:

# number = 20
__iadd__ : 0.69766775
  extend : 0.69303196    # "fastest"
 tricked : 0.74638002


# number = 200
__iadd__ : 6.94286992    # "fastest"
  extend : 6.96098415
 tricked : 7.46355973
如果您不需要这些东西,那么最好使用该链的生成器。从_iterablerepeatadded_data,10无需创建列表本身以减少使用的内存量

相关的:


如果您需要将数据作为列表,则不会有太多收获-list.extend和_iadd_uuu在性能上非常接近-取决于您使用其中一种或另一种数据的数量,它们的速度最快:

import timeit 
from itertools import repeat , chain 
raw_data = [] 
added_data = range(100000) # verify data : uncomment: range(5)

def iadd():
    raw_data = [] 
    for i in range(10):
        raw_data.__iadd__(added_data)
    # print(raw_data)

def extend():
    raw_data = [] 
    for i in range(10):
        raw_data.extend(added_data)
    # print(raw_data)

def tricked():
    raw_data = list(chain.from_iterable(repeat(added_data,10)))
    # print(raw_data)

for w,c in (("__iadd__",iadd),("  extend",extend),(" tricked",tricked)):
    print(w,end = " : ")
    print("{:08.8f}".format(timeit.timeit(c, number = 200)))
输出:

# number = 20
__iadd__ : 0.69766775
  extend : 0.69303196    # "fastest"
 tricked : 0.74638002


# number = 200
__iadd__ : 6.94286992    # "fastest"
  extend : 6.96098415
 tricked : 7.46355973
如果您不需要这些东西,那么最好使用该链的生成器。从_iterablerepeatadded_data,10无需创建列表本身以减少使用的内存量

相关的:


我不确定是否有更好的方法来实现这一点,但使用numpy和ctypes,您可以为整个阵列预先分配足够的内存,然后使用ctypes.memmove将数据复制到原始数据中—现在是ctypes.c_long的ctypes阵列

此代码在我的电脑上产生以下结果:

test_iadd 0.648954868317
test_extend 0.640357971191
test_memmove 0.201567173004

这似乎表明使用ctypes.memmove的速度要快得多。

我不确定是否有更好的方法来实现这一点,但使用numpy和ctypes,您可以为整个数组预先分配足够的内存,然后使用ctypes.memmove将数据复制到原始数据中-现在是ctypes.c_longs的ctypes数组

此代码在我的电脑上产生以下结果:

test_iadd 0.648954868317
test_extend 0.640357971191
test_memmove 0.201567173004

这似乎表明使用ctypes.memmove速度要快得多。

您好,欢迎使用Stack Overflow。你能解释一下这是怎么回答这个问题的吗?嗨,雅克,你试过了吗?我得到了正确的答案,但列表中会有列表。您可以通过在“打印原始数据”之前添加下面的代码行将其设置为一个列表。添加以下内容:原始数据=[x代表i,原始数据代表x代表i]看起来这个答案将生成一个包含10个列表的列表,每个列表都包含int。这个问题看起来需要一个10000000的1D列表ints@Bharath它现在可以工作了,不过当我运行它时,它比使用list.extendHi慢,欢迎使用Stack Overflow。你能解释一下这是怎么回答这个问题的吗?嗨,雅克,你试过了吗?我得到了正确的答案,但列表中会有列表。您可以通过在“打印原始数据”之前添加下面的代码行将其设置为一个列表。添加以下内容:原始数据=[x代表i,原始数据代表x代表i]看起来这个答案将生成一个包含10个列表的列表,每个列表都包含int。这个问题看起来需要一个10000000的1D列表ints@Bharath它现在可以工作了,尽管当我运行它时,它比使用list.extendplease、使用timeit stdlib模块或其他一些分析工具慢,但在单个作用域中执行time.time并不合适one@AzatIbrakov好啊谢谢,我来看看这个函数。@AzatIbrakov,按建议将time.time替换为timeit,谢谢@PatrickArtner,谢谢,标记现在已删除。请使用timeit stdlib模块或其他分析工具,time.time在单个作用域中执行是不合适的one@AzatIbrakov好啊谢谢,我来看看这个函数。@AzatIbrakov,按建议将time.time替换为timeit,谢谢@PatrickArtner,谢谢,标签现在被移除了。