В matplotlib, почему это быстрее, чтобы построить более тонкие линии?

Я наткнулся на это сегодня: кажется, что гораздо быстрее строить линии в 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()

И вот результат: enter image description here

Использование ширины линии меньше 1,0 обеспечивает ускорение ~ 10x, а после 1.0 время увеличивается линейно. Я наблюдаю этот эффект только в том случае, если число точек данных велико, более 5000 точек или около того. Для меня имеет смысл, что если я попрошу matplotlib отобразить больше пикселей, то может потребоваться немного больше времени, чтобы сделать сюжет, но я не ожидал огромного ускорения для использования немного меньшей ширины линии (0.5 по сравнению с 1.0).

Может ли кто-нибудь объяснить, почему это происходит? Я рад, что открыл его, поскольку он значительно ускоряет отображение больших наборов данных.


Некоторые предположили, что это может быть специфично для Mac OSX. Это кажется вероятным. Если я попытаюсь сохранить графики в формате png, а не отображать их на экране, времена кажутся более случайным образом распределенными: enter image description here

Ответ 1

Возможно, кто-то может заменить это более подробным ответом, но, похоже, этот эффект уникален для MacOSX, поскольку он не появляется при сохранении цифр в виде png. На время построения графика также влияет версия Matplotlib (1.3.x против 1.3.0). Но, кажется, пользователи Mac могут наслаждаться ускорением для больших наборов данных, уменьшая ширину линии до значения меньше 1.0.