В чем разница между функцией b / w Python Range () и Numpy .arange ()? - PullRequest
0 голосов
/ 09 мая 2020

Я узнал из своего веб-поиска, что numpy .arange занимает меньше места, чем python функция диапазона. но я попытался использовать ниже, это дает мне другой результат.

import sys

x = range(1,10000)
print(sys.getsizeof(x))  # --> Output is 48

a = np.arange(1,10000,1,dtype=np.int8)
print(sys.getsizeof(a))  # --> OutPut is 10095

Кто-нибудь может объяснить?

Ответы [ 2 ]

1 голос
/ 09 мая 2020

Конструктор типов range создает range объектов, которые представляют последовательности целых чисел с началом, остановкой и шагом в экономном пространстве, вычисляя значения на лету.

np.arange функция возвращает объект numpy.ndarray, который по сути является оболочкой вокруг примитивного массива. Это быстрое и относительно компактное представление по сравнению с тем, если вы создали python list, поэтому list(range(N)), но range объекты занимают больше места и действительно занимают константу пространство, поэтому для всех практических целей range(a) имеет тот же размер, что и range(b) для любых целых чисел a, b

Кроме того, вы должны внимательно интерпретировать результаты sys.getsizeof, вы должны понимать, что это делается. Так что не стоит наивно сравнивать размер списков Python и numpy .ndarray, например.

Возможно, все, что вы читали, относилось к Python 2, где range вернул список . Для объектов списка обычно требуется больше места, чем numpy.ndarray объектов.

0 голосов
/ 09 мая 2020

В PY3 range - это объект, который может генерировать последовательность чисел; это не настоящая последовательность. Возможно, вам потребуется sh на некоторых основных c Python чтениях, обращая внимание на такие вещи, как списки и генераторы, и их различия.

In [359]: x = range(3)                                                                                 
In [360]: x                                                                                            
Out[360]: range(0, 3)

Мы использовали что-то вроде list или понимание списка, чтобы фактически создать эти числа:

In [361]: list(x)                                                                                      
Out[361]: [0, 1, 2]
In [362]: [i for i in x]                                                                        
Out[362]: [0, 1, 2]

Диапазон часто используется в for i in range(3): print(i) типе l oop.

arange - это numpy функция, которая создает numpy массив:

In [363]: arr = np.arange(3)                                                                           
In [364]: arr                                                                                          
Out[364]: array([0, 1, 2])

Мы можем выполнять итерацию по такому массиву, но это медленнее, чем [362]:

In [365]: [i for i in arr]                                                                             
Out[365]: [0, 1, 2]

Но для математических вычислений массив намного лучше:

In [366]: arr * 10                                                                                     
Out[366]: array([ 0, 10, 20])

Массив также может быть создан из списка [361] (и для совместимости с более ранним использованием Py2 из самого range):

In [376]: np.array(list(x))     # np.array(x)                                                                        
Out[376]: array([0, 1, 2])

Но это медленнее, чем использование arange напрямую (это деталь реализации).

Несмотря на схожесть имен, их не следует рассматривать как простые альтернативы. Используйте range в базовых конструкциях c Python, таких как for l oop и понимание. Используйте arange, когда вам нужен массив.

Важным нововведением в Python (по сравнению с более ранними языками) является то, что мы можем выполнять итерацию непосредственно в списке. Нам не пришлось переходить по индексам. И если нам нужны индексы вместе со значениями, мы могли бы использовать enumerate:

In [378]: alist = ['a','b','c']                                                                        
In [379]: for i in range(3): print(alist[i])   # index iteration                                                        
a
b
c
In [380]: for v in alist: print(v)    # iterate on list directly                                       
a
b
c
In [381]: for i,v in enumerate(alist): print(i,v)    #  index and values                                                  
0 a
1 b
2 c

Таким образом, вы могли бы не увидеть, что range используется так много в базовом c Python коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...