Я читал о List comprehension without [ ] in Python так что теперь я знаю, чтоКак питон оптимизации условных списковых
''.join([str(x) for x in mylist])
быстрее, чем
''.join(str(x) for x in mylist)
, потому что «списочные оптимизированы»
Я предположим, что оптимизация основана на разборе выражения for
, видит mylist
, вычисляет его длину и использует его для предварительного выделения т. е. размер точного массива, что экономит много перераспределения.
При использовании ''.join(str(x) for x in mylist)
, join
получает генератор вслепую и должен построить свой список, не зная размера заранее.
Но теперь подумайте:
mylist = [1,2,5,6,3,4,5]
''.join([str(x) for x in mylist if x < 4])
Как питон решить размера списка понимания? Вычисляется ли он из размера mylist
и сокращается, когда итерации выполняются (что может быть очень плохо, если список большой, а условие отфильтровывает 99% элементов), или оно возвращается обратно к «не знаю» размер заранее "случай?
EDIT: Я сделал несколько небольших тестов, и это, кажется, подтверждает, что есть оптимизация:
без условия:
import timeit
print(timeit.timeit("''.join([str(x) for x in [1,5,6,3,5,23,334,23234]])"))
print(timeit.timeit("''.join(str(x) for x in [1,5,6,3,5,23,334,23234])"))
дает (как и ожидалось):
3.11010817019474
3.3457350077491026
с условием:
print(timeit.timeit("''.join([str(x) for x in [1,5,6,3,5,23,334,23234] if x < 50])"))
print(timeit.timeit("''.join(str(x) for x in [1,5,6,3,5,23,334,23234] if x < 50)"))
выходы:
2.7942209702566965
3.0316467566203276
так условно listcomp еще быстрее.
Ответит ли это на ваш вопрос: [Сводка списка по сравнению с результатами weird timeit в выражении генератора?] (Http://stackoverflow.com/questions/11964130/list-comprehension-vs-generator-expressions-weird-timeit-results) –
неплохо, но в этом вопросе никогда не бывает условия _after_ цикла for. Только в самом выражении, что означает, что размер известен заранее. –
Я думаю, что поведение в отношении того, как Python имеет дело с 'for x в xx для y в yy' при использовании связанного вопроса и' для x в y, если x <123' в вашем вопросе должно быть аналогичным, как в случае Python do не знать размер результирующего списка до тех пор, пока выражение не будет оценено. * (просто логическое предположение, не уверен, что это правда) * –