Я наткнулся на это сегодня: кажется, что гораздо быстрее строить линии в matplotlib, если ширина линии меньше 1.0. Я тестировал это только на Mac, но эффект кажется очень сильным.
Например, если вы попробуете этот код, вы увидите, что данные занимают примерно 10 раз быстрее с шириной линии 0,5, а не шириной линии 1,0.
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0,10,20000)
y = np.sin(x) + np.random.random(len(x))*0.1
plt.ion()
plt.show()
plt.plot(x,y,lw=0.5)
plt.draw()
plt.figure()
plt.plot(x,y,lw=1.0)
plt.draw()
Я использовал этот код, чтобы составить график зависимости между шириной линии и скоростью:
import numpy as np
import matplotlib.pyplot as plt
import time
x = np.linspace(0,10,10000)
y = np.sin(x) + np.random.random(len(x))*0.1
plt.ion()
plt.show()
linewidths = np.linspace(2,0,20)
times = []
for lw in linewidths:
t = time.time()
plt.plot(x,y,lw=lw)
plt.draw()
times.append(time.time()-t)
plt.figure()
plt.ioff()
plt.plot(linewidths[1:],times[1:],'ro')
plt.xlabel('Linewidth (points)')
plt.ylabel('Time (seconds)')
plt.show()
И вот результат:
Использование ширины линии меньше 1,0 обеспечивает ускорение ~ 10x, а после 1.0 время увеличивается линейно. Я наблюдаю этот эффект только в том случае, если число точек данных велико, более 5000 точек или около того. Для меня имеет смысл, что если я попрошу matplotlib отобразить больше пикселей, то может потребоваться немного больше времени, чтобы сделать сюжет, но я не ожидал огромного ускорения для использования немного меньшей ширины линии (0.5 по сравнению с 1.0).
Может ли кто-нибудь объяснить, почему это происходит? Я рад, что открыл его, поскольку он значительно ускоряет отображение больших наборов данных.
Некоторые предположили, что это может быть специфично для Mac OSX. Это кажется вероятным. Если я попытаюсь сохранить графики в формате png, а не отображать их на экране, времена кажутся более случайным образом распределенными: