Профилируя потребление памяти в моем алгоритме, я был удивлен, что иногда для небольших входов требуется больше памяти.
Все это сводится к следующему использованию pandas.unique()
:
import numpy as np
import pandas as pd
import sys
N=int(sys.argv[1])
a=np.arange(N, dtype=np.int64)
b=pd.unique(a)
с N=6*10^7
ему нужна память в 3.7GB
, но с N=8*10^7
"только" 3GB
.
Сканирование различных размеров ввода дает следующий график:
Из любопытства и самообразования: как можно объяснить противоречивое поведение (т.е. Больше памяти для меньшего размера ввода) вокруг N=5*10^7
, N=1.3*10^7
?
Вот сценарии для создания графика потребления памяти в Linux:
pandas_unique_test.py:
import numpy as np
import pandas as pd
import sys
N=int(sys.argv[1])
a=np.arange(N, dtype=np.int64)
b=pd.unique(a)
show_memory.py:
import sys
import matplotlib.pyplot as plt
ns=[]
mems=[]
for line in sys.stdin.readlines():
n,mem = map(int, line.strip().split(" "))
ns.append(n)
mems.append(mem)
plt.plot(ns, mems, label='peak-memory')
plt.xlabel('n')
plt.ylabel('peak memory in KB')
ymin, ymax = plt.ylim()
plt.ylim(0,ymax)
plt.legend()
plt.show()
run_perf_test.sh:
WRAPPER="/usr/bin/time -f%M" #peak memory in Kb
N=1000000
while [ $N -lt 100000000 ]
do
printf "$N "
$WRAPPER python pandas_unique_test.py $N
N='expr $N + 1000000'
done
И сейчас:
sh run_perf_tests.sh 2>&1 | python show_memory.py