为什么处理随机列表比处理有序列表快得多?

2024-10-01 22:40:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图提高func函数的性能,我发现在生成aX列表的方式上做一个简单的更改就可以大大提高性能:

import timeit
import numpy as np

def func(a, b):
    return [_ for _ in a if _ not in b]

Na, Nb = 10000, 5000
b = list(np.random.randint(1000, size=Nb))

# Ordered list of Na integers
a1 = [_ for _ in range(Na)]
# Random list of Na integers
a2 = list(np.random.randint(Na, size=Na))
# Ordered list of Na integers generated with numpy
a3 = list(np.arange(Na))

start_time = timeit.default_timer()
ab1 = func(a1, b)
abt1 = timeit.default_timer() - start_time
print("Time ab1", abt1)

start_time = timeit.default_timer()
ab2 = func(a2, b)
abt2 = timeit.default_timer() - start_time
print("Time ab2", abt2)

start_time = timeit.default_timer()
ab3 = func(a3, b)
abt3 = timeit.default_timer() - start_time
print("Time ab3", abt3)

print("Ratio 1/2:", abt1 / abt2)
print("Ratio 1/3:", abt1 / abt3)

在Python 2.7.13中,这将导致:

^{pr2}$

在Python 3.5.2中,差别更大:

Time ab1 6.758207322000089
Time ab2 1.5693355060011527
Time ab3 1.5148192759988888
Ratio 1/2: 4.306413317073784
Ratio 1/3: 4.461395117608107

我需要处理一个有序列表整数(即:a1或{}),所以我的问题是:

为什么随机列表的处理速度比使用numpy生成的有序列表快得多?在


Tags: innumpydefaulttimenpstartlistfunc
2条回答

如前所述,herenumpy数组比python列表快得多。这就是为什么numpy数组看起来更快,因为在调用list()函数时仍然使用numpy数组。在

使用numpy^{}函数将numpy数组完全转换为常规Python对象(如user2357112所指出),性能差异将消失,请参见:

import timeit
import numpy as np

def func(a, b):
    return [_ for _ in a if _ not in b]

Na, Nb = 10000, 5000
b = list(np.random.randint(Na, size=Nb)) # len: 5000, max: 9999

# Ordered list of Na integers
a1 = [_ for _ in range(Na)] # len: 10000, max: 9999
# Random list of Na integers
a2 = np.random.randint(Na, size=Na).tolist() # len: 10000, max: 9999
# Ordered list of Na integers generated with numpy
a3 = np.arange(Na).tolist()

start_time = timeit.default_timer()
ab1 = func(a1, b)
abt1 = timeit.default_timer() - start_time
print("Time ab1", abt1)

start_time = timeit.default_timer()
ab2 = func(a2, b)
abt2 = timeit.default_timer() - start_time
print("Time ab2", abt2)

start_time = timeit.default_timer()
ab3 = func(a3, b)
abt3 = timeit.default_timer() - start_time
print("Time ab3", abt3)

print("Ratio 1/2:", abt1 / abt2)
print("Ratio 1/3:", abt1 / abt3)

#Time ab1 4.622085004015502
#Time ab2 4.598610720638726
#Time ab3 4.63976530848255
#Ratio 1/2: 1.005104646773301
#Ratio 1/3: 0.9961893968139456

希望这能回答你的第一个问题!在

您的ba2和{}列表是NumPy标量的列表,而您的a1列表是普通Python int的列表。比较NumPy标量和普通Python标量需要一个额外的类型检查和强制的lot,因此需要比较NumPy标量和普通Python标量的func(a1, b)测试的执行速度最慢。在

如果使b成为Python int的列表(通过调用^{} method而不是{}函数),则时间差是相反的。在

您可能需要考虑使用Python sets或NumPy的set-like operations来执行任务。在

相关问题 更多 >

    热门问题