Скорость вывода списка в зависимости от скорости построения массива Numpy - PullRequest
0 голосов
/ 14 мая 2019

Здравствуйте, дорогие пользователи stackoverflow.У меня есть концептуальный вопрос (следовательно, код не требуется).Мне было интересно, может ли кто-нибудь помочь мне с этим, пожалуйста.
Предположим, у меня есть список чисел с плавающей точкой в ​​Python и массив с одинаковыми числами.И я хочу построить их в matplotlib (независимо от времени, пространственной координаты или чего-либо еще - это не имеет значения).Я хочу двухмерный график.
Что будет отображаться быстрее: список питонов или массивный массив?
Заранее спасибо.
PS Просто чтобы уточнить, если это проблема.Рассмотрим пример: у меня есть данные о скорости объекта в зависимости от времени.Рассмотрим два случая.Во-первых, я сохраняю данные о скорости в списке питонов и соответствующее время в другом списке питонов.Затем подготовьте их в matplotlib.Во-вторых, я сохраняю точки данных скорости в массиве Numpy и соответствующие времена в другом массиве NUMPY.Затем подготовьте их в matplotlib.В каком из случаев построение графиков будет выполняться быстрее?

Возникновение проблемы заключается в моей попытке численно решить переходную модель дрейфового потока.У меня было относительно большое количество шагов (временных и пространственных шагов).Я использовал списки Python для решения.Я не использовал решатель - я написал свой собственный код.Когда я попытался отобразить данные в matplotlib, у меня не получилось.Matplotlib слишком медленный.Я использовал pyqtgraph и сумел построить данные.Но я хочу еще больше увеличить скорость печати.Вот почему я рассматриваю возможность использования массивов numpy.

1 Ответ

0 голосов
/ 14 мая 2019

Тестирование в IPython:

np.random.seed(123)

# arrays:
a = np.random.randint(0,1000,10000)
b = np.random.randint(0,1000,10000)

%%timeit -r 10 -n 10
plt.scatter(a, b)
plt.close()
54.7 ms ± 1.43 ms per loop (mean ± std. dev. of 10 runs, 10 loops each)

# lists
c = [f for f in a]
d = [f for f in b]

%%timeit -r 10 -n 10
plt.scatter(c, d)
plt.close()

154 ms ± 5.07 ms per loop (mean ± std. dev. of 10 runs, 10 loops each)

Похоже, что построение массивов здесь происходит быстрее.

Тестирование большего количества случаев различной длины:

         #length|mean|sd
lists = [
         (10000, 154, 5.07),
         (1000, 33 , 0.235),
         (100, 21, 0.198),
         (10, 19.4, 0.937)
         ]
arrays = [
         (10000, 54.7, 1.43), 
         (1000, 21.8, 1.51),
         (100,18.4, 1.16),
         (10, 18.1, 1.87)
         ]

# convert to arrays... for faster plotting ;)
lists = np.array(lists)
arrays = np.array(arrays)

plt.errorbar(lists[:,0], lists[:,1], yerr=lists[:,2], color = 'orange', label='lists', fmt='o')
plt.errorbar(arrays[:,0], arrays[:,1], yerr=arrays[:,2], color = 'teal', label='arrays', fmt='o')
plt.xscale('log')
plt.legend()
plt.xlabel('length of plotted data')
plt.ylabel('time per plot / ms')

enter image description here

Редактировать:

Только что увидел, что вы смотрите на поплавки.Я переделал эксперимент с поплавками, и результаты почти такие же:

#data generation:
np.random.seed(123)
a = np.random.rand(10000) * 1000
b = np.random.rand(10000) * 1000

lists = [
        (10000, 155, 13.6),
        (1000, 33 , 0.443),
        (100, 21, 0.436),
        (10, 19.1, 1.09)
        ]
arrays = [
         (10000, 54.5, 3.24), 
         (1000, 21.6, 1.97),
         (100, 18.6, 1.61),
         (10, 19.4, 1.51)
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...