Для разницы в производительности цикла и цикла в Python с использованием timeit - PullRequest
0 голосов
/ 07 июня 2018

Я наткнулся на код, когда делал какой-то обзор, и у него был цикл while, я не обращал внимания на то, что пытался найти его версию, но оказалось, что он работает значительно хуже.Ниже приведен код

import timeit

sp_list = list(range(1,9801))
start = 0
bs = 1000
end = start + bs
content =[]
content1 = []
s="""\
while sp_list[start:end]:
    sp_batch = sp_list[start:end]
    for sp in sp_batch:
        content.append(sp*sp)
    start += bs
    end += bs
"""
print("S")
x = timeit.timeit(stmt=s, number=100, setup='sp_list = list(range(1,9801));start = 0;bs = 1000;end = start + bs;content =[]')
print(x)

s1="""\
for i in range(1, len(sp_list), bs):
    content1.extend([x*x for x in sp_list[i:i+bs]])
"""

x1 = timeit.timeit(stmt=s1, number=100, setup='sp_list = list(range(1,9801));start = 0;bs = 1000;end = start + bs;content1 =[]')
print(x1)

И следующий вывод:

('WHILE ', 0.0013229846954345703)
('FOR ', 0.05230712890625)

Почему цикл for работает значительно медленнее?Или я здесь упускаю основной трюк?

1 Ответ

0 голосов
/ 07 июня 2018

Вы уверены, что не путаете вывод (например, ваш код имеет print("S") и не имеет «WHILE» или «FOR»)?

Можно сделать некоторую очистку, чтобы сделать ваш оригинальный код отличным MVCE :

  • , чтобы вы могли получить тот же вывод, что и высделать из кода, и здесь это не тот случай, который добавляет немного путаницы.
  • некоторые повторяющиеся коды могут быть опущены

Я добавил кратное число к 9801, чтобы сделать код более длинным, и в результате на моей машине цикл for стал быстрее,Не используется timeit() функция, но результат складывается на многих итерациях.

import time

sp_list = list(range(1,9801*100))
start = 0
bs = 1000
end = start + bs

# experiment 1
now = time.time()

content = []
while sp_list[start:end]:
    sp_batch = sp_list[start:end]
    for sp in sp_batch:
        content.append(sp*sp)
    start += bs
    end += bs    

exp = time.time() - now

# experiment 2
now = time.time()
content = []

for i in range(1, len(sp_list), bs):
    content.extend([x*x for x in sp_list[i:i+bs]])

exp2 = time.time() - now


print(exp, exp2)
# 0.2183971405029297 0.12479853630065918

Понимание списка также имеет небольшое преимущество перед циклом:

now = time.time()
content = [x*x for i in range(1, len(sp_list), bs) for x in sp_list[i:i+bs]]
exp3 = time.time() - now
print(exp3)
# 0.09359884262084961
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...