因為經常一訓練就是很多次迭代,所以找到效率比較高的操作能大大縮短執行時間,但這方面資料不足,所以自己記錄總結一下,有需要再補充
有時候我需要乙個陣列,然後可能會頻繁從中索引資料,那麼我選擇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對列表進行反轉,都直接對列表進行了改變...