Woj*_*ilo 5 python performance profiling list concatenation
在python中扩展数组前端的最快方法是什么?假设我有2个数组:a和b.我想以a = b + a(b不应该改变)的最快方式.
我的小标记:
测试1:
a,b = [],[]
for i in range(0,100000):
a.append(i)
b.append(i)
def f(a,b):
for i in range(0,100):
a=a+b
import cProfile
cProfile.run('f(a,b)')
Run Code Online (Sandbox Code Playgroud)
时间:~12秒
测试2:
a,b = [],[]
for i in range(0,100000):
a.append(i)
b.append(i)
def f(a,b):
for i in range(0,100):
a[0:0] = b
import cProfile
cProfile.run('f(a,b)')
Run Code Online (Sandbox Code Playgroud)
时间:~1.5秒
TEST3:
a,b = [],[]
for i in range(0,100000):
a.append(i)
b.append(i)
lenb = len(b)
def f(a,b):
for i in range(0,100):
b.extend(a)
# do something with b
b = b[:lenb]
import cProfile
cProfile.run('f(a,b)')
Run Code Online (Sandbox Code Playgroud)
时间:~0.4s
但我认为它应该更快,因为列表连接应该作为几个底层指针的变化.以下代码是最快的代码,但更改b,而不是a(因为我们的目的不好):测试"错误":
a,b = [],[]
for i in range(0,100000):
a.append(i)
b.append(i)
def f(a,b):
for i in range(0,100):
b.extend(a)
import cProfile
cProfile.run('f(a,b)')
Run Code Online (Sandbox Code Playgroud)
时间:~0.13s
因此理论上应该有一种方法可以延长测试时间"WRONG"的时间.
lvc*_*lvc 10
绝对速度最快的方法是使用collections.deque它正是这种应用进行了优化,并已调用的方法.appendleft和.extendleft使代码漂亮和可读- appendleft不正是它在锡说(即追加到双端队列的左侧) ,并且extendleft相当于:
def extendleft(self, other)
for item in other:
self.appendleft(c)
Run Code Online (Sandbox Code Playgroud)
所以,a = b+a拼写:
a.extendleft(reversed(b))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1582 次 |
| 最近记录: |