Estou brincando com grandes listas para testar um cluster RPi. Estou construindo uma lista de cadeias de caracteres das quais eventualmente calcularei hashes para simular a mineração de criptomoedas. O código está sendo executado em um Raspberry Pi 3B Rev 1.2.
O código para construir a lista é:
from pympler import asizeof
import itertools
import time
start = time.process_time()
combos = list(itertools.combinations_with_replacement('abcdefghijlkmnopqrstuvwxyz', 6))
stop = time.process_time()
print(len(combos), asizeof.asizeof(combos)/1e6, (stop-start))
Os resultados são:
andrew@master:~ $ python mem_test_1.py
736281 70.727904 0.68859771
O problema é que o tempo real (usando um cronômetro) está próximo de 45 segundos. Essa diferença de tempo é reproduzível ao executar o código no meu macbook M2 (números diferentes, mas ainda uma grande discrepância). Também tentei time.time() e time.perf_counter() com os mesmos resultados.
Para onde vai todo o tempo perdido e o que eu perdi?
O efeito que você observa é causado pelo cálculo recursivo do tamanho total criado que
combos
você usa na instrução print, que também gera a diferença de tempo que você mediu e calculou antes de chamar aprint()
instrução. Portanto, o atraso que você observa esperando o script imprimir o resultado é o tempo que oprint
extrato está gastando para avaliar o que precisa ser impresso, onde a medição do tempo é finalizada antes de executar oprint
extrato.Verifique você mesmo e retire
asizeof.asizeof(combos)
oprint()
para ver que agora a diferença de tempo medida e impressa não diverge consideravelmente do tempo até você ver a saída na tela.Em outras palavras:
Você não considerou que a instrução print() leva tempo e todo o tempo que falta foi gasto no cálculo do tamanho total do
combos
usingasizeof.asizeof(combos)
.