欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python?list與numpy數(shù)組效率對比

 更新時間:2023年02月01日 08:30:26   作者:強殖裝甲凱普  
這篇文章主要介紹了python?list與numpy數(shù)組效率對比分析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

前言

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

索引效率與內(nèi)存占用比較

有時候我需要一個數(shù)組,然后可能會頻繁從中索引數(shù)據(jù),那么我選擇list還是numpy array呢,這里做了一個簡單的實驗進行比較,環(huán)境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)
    length.append(l)
    a = [1] * l
    b = np.array(a)
    c = deque(maxlen=l)
    for i in range(l):
        c.append(1)

    # print('list的size為:{}'.format(sys.getsizeof(a)))
    # print('array的size為:{}'.format(sys.getsizeof(b)))
    # print('deque的size為:{}'.format(sys.getsizeof(c)))
    list_size.append(sys.getsizeof(a))
    array_size.append(sys.getsizeof(b))
    deque_size.append(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':
            list_time.append(duration)
        elif name == 'array':
            array_time.append(duration)
        else:
            deque_time.append(duration)

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對內(nèi)存的優(yōu)化很好,長度越大,其相比list和deque占用內(nèi)存越少。

list比deque稍微好一點。因此如果對內(nèi)存占用敏感,選擇優(yōu)先級:numpy array>>list>deque。

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

  • 長度<1000左右時,deque跟list差不多,選擇優(yōu)先級:list≈ \approx≈deque>numpy array;
  • 長度<9000左右,選擇優(yōu)先級:list>deque>numpy array;
  • 長度>9000左右,選擇優(yōu)先級:list>numpy array>deque;

不過時間上的差距都不大,幾乎可以忽略,差距主要體現(xiàn)在內(nèi)存占用上。因此如果對內(nèi)存不敏感,list是最好選擇。

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

添加效率比較

numpy的數(shù)組沒有動態(tài)改變大小的功能,因此這里numpy數(shù)據(jù)只是對其進行賦值。

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):
            tmp.append(1)
    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秒

可以看出,只有在非常大的量級上才會出現(xiàn)區(qū)別,numpy array的賦值是最慢的,list和deque差不多

但平時這些差距幾乎可以忽略。

總結

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Pycharm 如何連接遠程服務器并debug調(diào)試

    Pycharm 如何連接遠程服務器并debug調(diào)試

    本文主要介紹了Pycharm 如何連接遠程服務器并debug調(diào)試,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-06-06
  • Python實現(xiàn)給文件添加內(nèi)容及得到文件信息的方法

    Python實現(xiàn)給文件添加內(nèi)容及得到文件信息的方法

    這篇文章主要介紹了Python實現(xiàn)給文件添加內(nèi)容及得到文件信息的方法,可實現(xiàn)從文件開頭添加內(nèi)容的功能,需要的朋友可以參考下
    2015-05-05
  • python3如何去除字符串中的特殊字符

    python3如何去除字符串中的特殊字符

    這篇文章主要介紹了python3如何去除字符串中的特殊字符,在平時處理字符串的時候,經(jīng)常會遇到字符串中夾雜著我們不希望看到的特殊字符,那么如何處理這些特殊字符呢,今天就跟著小編來看看吧
    2023-04-04
  • Python3中的bytes類型和str類型

    Python3中的bytes類型和str類型

    這篇文章主要介紹了Python3中的bytes類型和str類型,bytes是一種比特流,他們之間的關系則是Python有個內(nèi)置函數(shù)bytes()可以將字符串str類型轉換成bytes類型,下文更多詳細內(nèi)容需要的小伙伴可以參考一下
    2022-05-05
  • Python實現(xiàn)從訂閱源下載圖片的方法

    Python實現(xiàn)從訂閱源下載圖片的方法

    這篇文章主要介紹了Python實現(xiàn)從訂閱源下載圖片的方法,涉及Python采集的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • Python  中的pass語句語法詳析

    Python  中的pass語句語法詳析

    這篇文章主要介紹了Python 中的pass語句語法詳析,pass是一種空操作(null operation),解釋器執(zhí)行到它的時候,除了檢查語法是否合法,什么也不做就直接跳過
    2022-07-07
  • 解析ROC曲線繪制(python+sklearn+多分類)

    解析ROC曲線繪制(python+sklearn+多分類)

    這篇文章主要介紹了解析ROC曲線繪制(python+sklearn+多分類),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 18個幫你簡化代碼的Python技巧分享

    18個幫你簡化代碼的Python技巧分享

    選擇學習?python?時,最令我震驚的是它的簡單性和可讀性。但是你知道還可以用更少的代碼行可以讓?Python?代碼變得更簡單嗎?本文為大家總結了18個幫你簡化代碼的Python技巧,感興趣的可以了解一下
    2022-07-07
  • python或C++讀取指定文件夾下的所有圖片

    python或C++讀取指定文件夾下的所有圖片

    這篇文章主要為大家詳細介紹了python或C++讀取指定文件夾下的所有圖片,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • TensorFlow獲取加載模型中的全部張量名稱代碼

    TensorFlow獲取加載模型中的全部張量名稱代碼

    今天小編就為大家分享一篇TensorFlow獲取加載模型中的全部張量名稱代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02

最新評論