Это дополнительные вопросы к предыдущему .
Рассмотрим этот код, который менее забавен, чем тот, что был в предыдущем вопросе (но все же намного проще, чем мой настоящий)
import sys
data=[]
for line in open(sys.argv[1]):
data.append(line[-1])
print data[-1]
Теперь я ожидал более продолжительного времени выполнения (мой файл теста имеет длину 65150224 строки), возможно, намного дольше. Это был не тот случай, он работает за ~ 2 минуты на том же hw, что и раньше!
Является ли data.append () очень легким? Я не верю в это, поэтому я написал этот фальшивый код для проверки:
data=[]
counter=0
string="a\n"
for counter in xrange(65150224):
data.append(string[-1])
print data[-1]
Это выполняется за 1,5–3 минуты (между прогонами есть сильная вариабельность)
Почему я не получаю 3,5-5 минут в предыдущей программе? Очевидно, data.append () происходит параллельно с IO.
Это хорошие новости!
Но как это работает? Это документированная особенность? Есть ли какое-то требование к моему коду, которому я должен следовать, чтобы он работал как можно больше (кроме операций ввода-вывода с балансировкой нагрузки и операций с памятью / процессором)? Или это просто буферизация / кеширование в действии?
Опять же, я отметил этот вопрос как "linux", потому что меня интересуют только ответы, относящиеся к linux. Не стесняйтесь давать ответы, не зависящие от ОС, или даже от других ОС, если вы считаете, что это стоит делать.