python list與numpy陣列效率比較

2021-10-10 03:05:46 字數 3658 閱讀 9862

因為經常一訓練就是很多次迭代,所以找到效率比較高的操作能大大縮短執行時間,但這方面資料不足,所以自己記錄總結一下,有需要再補充

有時候我需要乙個陣列,然後可能會頻繁從中索引資料,那麼我選擇list還是numpy array呢,這裡做了乙個簡單的實驗進行比較,環境python 3.6

import random

import numpy as np

import time

import sys

# import matplotlib

# matplotlib.use('agg')

import matplotlib.pyplot as plt

from collections import deque

start = time.time()

length =

list_size =

array_size =

deque_size =

list_time =

array_time =

deque_time =

for l in range(5, 15000, 5):

print(l)

a = [1] * l

b = np.array(a)

c = deque(maxlen=l)

for i in range(l):

# print('list的size為:{}'.format(sys.getsizeof(a)))

# print('array的size為:{}'.format(sys.getsizeof(b)))

# print('deque的size為:{}'.format(sys.getsizeof(c)))

for i in range(3):

if i == 0:

tmp = a

name = 'list'

elif i == 1:

tmp = b

name = 'array'

else:

tmp = c

name = 'deque'

s = time.time()

for j in range(1000000):

x = tmp[random.randint(0, len(a)-1)]

duration = time.time() - s

if name == 'list':

elif name == 'array':

else:

duration = time.time() - start

time_list = [0, 0, 0]

time_list[0] = duration // 3600

time_list[1] = (duration % 3600) // 60

time_list[2] = round(duration % 60, 2)

print('用時:' + str(time_list[0]) + ' 時 ' + str(time_list[1]) + '分' + str(time_list[2]) + '秒')

fig = plt.figure()

ax1 = fig.add_subplot(211)

ax1.plot(length, list_size, label='list')

ax1.plot(length, array_size, label='array')

ax1.plot(length, deque_size, label='deque')

plt.xlabel('length')

plt.ylabel('size')

plt.legend()

ax2 = fig.add_subplot(212)

ax2.plot(length, list_time, label='list')

ax2.plot(length, array_time, label='array')

ax2.plot(length, deque_time, label='deque')

plt.xlabel('length')

plt.ylabel('time')

plt.legend()

plt.show()

對不同大小的list,numpy array和deque進行一百萬次的索引,結果為

可以看出,numpy array對記憶體的優化很好,長度越大,其相比list和deque占用記憶體越少。list比deque稍微好一點。因此如果對記憶體占用敏感,選擇優先順序:numpy array>>list>deque

時間上,在15000以下這個長度,list基本都最快。其中

不過時間上的差距都不大,幾乎可以忽略,差距主要體現在記憶體占用上。因此如果對記憶體不敏感,list是最好選擇。

整個實驗使用i7-9700,耗時2.0 時 36.0分20.27秒,如果有人願意嘗試更大的量級,更小的間隔,歡迎告知我結果。

numpy的陣列沒有動態改變大小的功能,因此這裡numpy資料只是對其進行賦值。

import numpy as np

import time

from collections import deque

l = 10000000

a =

b = np.zeros(l)

c = deque(maxlen=l)

for i in range(3):

if i == 0:

tmp = a

name = 'list'

elif i == 1:

tmp = b

name = 'array'

else:

tmp = c

name = 'deque'

start = time.time()

if name == 'array':

for j in range(l):

tmp[j] = 1

else:

for j in range(l):

duration = time.time() - start

time_list = [0, 0, 0]

time_list[0] = duration // 3600

time_list[1] = (duration % 3600) // 60

time_list[2] = round(duration % 60, 2)

print(name + '用時:' + str(time_list[0]) + ' 時 ' + str(time_list[1]) + '分' + str(time_list[2]) + '秒')

結果為:

list用時:0.0 時 0.0分1.0秒

array用時:0.0 時 0.0分1.14秒

deque用時:0.0 時 0.0分0.99秒

可以看出,只有在非常大的量級上才會出現區別,numpy array的賦值是最慢的,list和deque差不多。但平時這些差距幾乎可以忽略。

python List與String 轉化問題

現有list如下 a i 0,0,0,0,0 注意此時0為整數 現在希望將a轉化為string 使用如下語句 str1 str1.join a 0 print str1 發現執行出錯,求指教!1.string的jion 方法,裡面使用的引數需要是所有元素都是string的list 而你的list a...

python list 查詢與過濾方法整合

這個是乙個最基礎的操作,使用in操作符,如下所示 3in 1,2,3 true過濾出滿足一定條件的所有元素,可以使用列表表示式或者生成器表示式 matches x for x in lst if fulfills some condition x matches x for x in lst if ...

python list常用操作

list的常用操作 因為列表是可變的,大多數列表的方法都會就地改變列表物件 2.pop 2 移除給定偏移量的一項,從而使列表減小 3.remove 按照值移除元素 4.insert可以在任意位置插入元素 5.sort 預設按照公升序對列表進行排序,reverse對列表進行反轉,都直接對列表進行了改變...