Список Python против производительности и профилей Array - PullRequest
0 голосов
/ 26 октября 2018

Этот вопрос, это больше для обсуждения array против list в python, и если это стоит того, чтобы изменить кодовую базу с чисел list на числа arrays. Это использует стандартные модули Python, а не numpy.

Я смотрел на модуль array из стандартной библиотеки Python, и он привлек мое внимание, что я вполне мог бы провести некоторый «простой» численный анализ и сжатие чисел, заменив мои списки чисел массивами парных чисел или плавает, (в зависимости от случая).

Кто-нибудь, кто имеет опыт работы с объектом array в python, может поделиться сравнением или почему он решил их использовать? У меня все еще есть проблемы с этим решением.

Меня беспокоит то, могу ли я каким-либо образом использовать массивы массивов или список массивов, и если это повысит мою производительность, сейчас у меня есть списки списков чисел, и я пытаюсь использовать python без каких-либо зависимостей, поэтому не NumPy.

Если я исправлю внутренний объект python list Это динамический массив, я не уверен в этом.

Я провел этот тест, используя size = sys.getsizeof и array = array.array, я знаю, что это может быть не очень хорошим сравнением, но все же это вызывает некоторые вопросы.

>>> for i in range(0, 100, 5):
...     test = [1.0*j for j in range(i)]
...     a = array('f', test)
...     print(f"{i} | {size(a)} | {size(test)}")

len|array|list
---|-----|----
 0 |  32 |  36 
 5 |  52 |  68 
10 |  72 | 100 
15 |  92 | 100 
20 | 112 | 136
25 | 132 | 136
30 | 152 | 176
35 | 172 | 176
40 | 192 | 220
45 | 212 | 220
50 | 232 | 268
55 | 252 | 268
60 | 272 | 324
65 | 292 | 324
70 | 312 | 324
75 | 332 | 388
80 | 352 | 388
85 | 372 | 388
90 | 392 | 460
95 | 412 | 460

Ответы [ 3 ]

0 голосов
/ 26 октября 2018

Так как ваша основная задача - производительность, а вы работаете с числами, то модуль Python array будет вашим ответом. Из официальных документов Python 3:

Этот модуль определяет тип объекта, который может компактно представлять массив базовых значений: символы, целые числа, числа с плавающей запятой. Массивы являются типами последовательностей и ведут себя очень похоже на списки, за исключением того, что тип хранимых в них объектов ограничен. Тип указывается во время создания объекта с помощью кода типа, который представляет собой один символ. Определены следующие коды типов: Таблица кодов типов .

Это ограничение типа сделано для обеспечения эффективной реализации массива на стороне интерпретатора, например, CPython. Коды типов являются мостом между Python, являющимся , динамически типизированным , и C, являющимся , статически типизированным (в случае CPython).

В противном случае, используя список , вы обычно будете терять производительность, поскольку список может обрабатывать все типы. Я должен предупредить, что потеря производительности незначительна для меньших наборов данных / скоростей работы.

0 голосов
/ 05 июля 2019

Проблемы с производительностью связаны с хранением и доступом к хранилищу переменных.Списки хранятся в виде узлов с двумя блоками - значением хранилища и индикатором местоположения для следующего узла.Хранение массива непрерывно.Такое хранилище имеет различное влияние на доступ и изменение данных, хранящихся в них.Это видео подробно о последствиях - https://www.youtube.com/watch?v=lC-yYCOnN8Q

0 голосов
/ 26 октября 2018

Так как ваша основная задача - производительность, а вы работаете с числами, то модуль Python array будет вашим ответом.Из официальных документов Python 3:

Этот модуль определяет тип объекта, который может компактно представлять массив основных значений: символы, целые числа, числа с плавающей запятой.Массивы являются типами последовательностей и ведут себя очень похоже на списки, за исключением того, что тип хранимых в них объектов ограничен.Тип указывается во время создания объекта с помощью кода типа, который представляет собой один символ.Определены следующие коды типов: Таблица кодов типов .

Это ограничение типа сделано для обеспечения эффективной реализации массива на стороне интерпретатора, например, CPython.Коды типов являются мостом между динамически типизированным (Python) и статически типизированным (C в случае CPython).

В противном случае используется список , вы, как правило, будете терять производительность, поскольку список может обрабатывать все типы.Я должен предупредить, что потеря производительности незначительна для меньших наборов данных / скоростей работы.

...