gpt4 book ai didi

python - 为什么返回列表比附加到返回变量更快?

转载 作者:行者123 更新时间:2023-11-30 23:15:17 25 4
gpt4 key购买 nike

在我看来,使用返回变量而不是使用 return 语句意味着您应该跳过列表的副本。它的可读性较差,但我认为它会更快。

所以我测试了它:

import timeit

TEST_DATA = 10000000
ITERATIONS = 1000

time_taken = timeit.timeit(
"""
def get_big_list(test_data):
return [random.random() for _ in range(100000)]

return_list = get_big_list(test_data)

""",
setup='import random; test_data ={0}'.format(TEST_DATA), number=ITERATIONS)

print("return_list", time_taken / ITERATIONS)

# ----------------------------- SECOND TEST -----------------------------------

time_taken = timeit.timeit(
"""
def get_big_list(test_data, return_list):
[return_list.append(random.random()) for _ in range(100000)]

return_list = []
get_big_list(test_data, return_list)

""",
setup='import random; test_data ={0}'.format(TEST_DATA), number=ITERATIONS)

print("return_list", time_taken / ITERATIONS)

我对收到的数字感到非常惊讶,我不明白为什么返回语句更快。

$ python large_list_return.py 
('return_list', 0.013130356788635254)
('return_list', 0.022573610067367553)
$ python3 large_list_return.py
return_list 0.016797171516984236
return_list 0.02749005461903289

我发现的另一件有趣的事情是,使用 for 循环进行追加比使用列表理解更快。

time_taken = timeit.timeit(
"""
def get_big_list(test_data, return_list):
for index in range(100000):
return_list.append(random.random())

return_list = []
get_big_list(test_data, return_list)

""",
setup='import random; test_data ={0}'.format(TEST_DATA), number=ITERATIONS)

返回了这些数字

python large_list_return.py 
('return_list', 0.0133241708278656)
('return_list', 0.019642770051956176)
python3 large_list_return.py
return_list 0.017075919962022453
return_list 0.024502045304980128

最佳答案

Python 不会创建副本,除非您明确请求副本(例如,通过获取列表的切片)——您只是获得对已创建的列表的另一个引用。

append 另一方面可能需要获取更多内存并复制以前的内容 - 它的摊销时间为 O(1),但仍然需要更多工作。

此外,由于您对应该是循环的内容使用了列表理解:

[return_list.append(random.random()) for _ in range(100000)]

在你的第二个实现中,你创建了另一个列表(然后你将其扔掉),该列表由十万次出现的 None (从 append 返回值。这就是为什么 for 在那里更快 - 它避免了无用地创建冗余列表。

如果您正在寻求优化,请考虑提升命名空间查找,正如我在上面的评论中提到的。具体来说,使用:

def get_big_list(test_data):
r = random.random
return [r() for _ in range(100000)]

在我过时的笔记本电脑上,这需要 12 毫秒,而第一个版本需要 17 毫秒(这告诉我们每个 random.random 查找大约需要 50 纳秒)。

关于python - 为什么返回列表比附加到返回变量更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28312424/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com