国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Python 性能優(yōu)化|多線程讀取文件

這篇具有很好參考價值的文章主要介紹了Python 性能優(yōu)化|多線程讀取文件。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

分析結論

多進程可以實現(xiàn)逐行遍歷同一個文件(可以保證每一個進程遍歷的行都是完整且互不重復的),且可以提高遍歷性能。

多進程 / 多線程遍歷文件速度
  1. 單進程、多線程讀取同一個文件時,每個線程的運行時間并不能隨線程數(shù)的增加的降低;
  2. 多進程讀取同一個文件時,每個進程的運行時間隨線程數(shù)的增加而降低。
進一步優(yōu)化方法

通過統(tǒng)計讀取到的字符串長度,計算當前文件指針位置,從而避免在每次遍歷中均需使用 file.tell() 獲取當前文件指針位置。

分析過程

構造 11202 MB、691130 行的測試數(shù)據(jù)。具體測試數(shù)據(jù)特征如下:

  • 文件大小:11746098941 Bytes(11202 MB)
  • 行數(shù):691130
import time
1. 單進程、單線程遍歷文件
t1 = time.time()
with open(path, "r", encoding="UTF-8") as file:
    for _ in file:
        pass
t2 = time.time()
print(t2 - t1)

運行時間:21.79 秒(三次測試 23.55、20.84、21.00 取平均值)

2. 多線程遍歷文件
import os
from theading import Thread

定義每個線程 / 進程的遍歷函數(shù)如下:通過捕獲 UnicodeDecodeError 異常,避免出現(xiàn)剛好切分到半個字的情況;通過在遍歷前先 file.readline(),使每一個切分點中尚未結束的行一定歸屬上一進程 / 線程而不是下一進程 / 線程,從而保證每一個進程 / 線程遍歷的每一行都是完整且互不重復的。

def read(path, start, end):
    """每個進程 / 線程的遍歷函數(shù)

    Parameters
    ----------
    path : str
        文件路徑
    start : int
        本分塊的開始位置
    end : int
        本分塊的結束位置
    """
    cnt = 0
    with open(path, "r", encoding="UTF-8") as file:
        file.seek(start)  # 移動到目標位置
        if start != 0:
            while True:
                try:
                    file.readline()  # 跳過當前行(所有未遍歷完的行屬于上一段)
                    break
                except UnicodeDecodeError:  # 剛好切分到半個字,向后移動一個字符
                    file.seek(start + 1)
        while file.tell() <= end:
            file.readline()
            cnt += 1

定義多線程遍歷函數(shù):

def multi_thread_load_csv(path: str, n_thread: int):
    """多線程遍歷函數(shù)"""
    size = os.path.getsize(path)  # 獲取文件大小用于分塊
    thread_lst = []
    for i in range(n_thread):
        s = size // n_thread * i  # 計算當前分塊開始位置
        e = size // n_thread * (i + 1)  # 計算當前分塊結束位置
        thread = Thread(target=read, args=(s, e))
        thread.start()
        thread_lst.append(thread)

    for thread in thread_lst:
        thread.join()

測試線程數(shù)為 1 - 10 之間的讀取時間,每種線程數(shù)測試 10 次,測試代碼及結果如下:

import numpy as np

for k in range(1, 11):
    use_time = []
    for _ in range(10):
        t1 = time.time()
        multi_thread_load_csv("/home/txjiang/archive_analysis/gather_detail.txt", k)
        t2 = time.time()
        use_time.append(t2 - t1)
        print(f"線程={k} 平均時間={np.average(use_time)} 標準差={np.std(use_time)}")
線程數(shù) 用時的平均值 用時的標準差
1 49.0841 0.6299
2 53.2189 1.4267
3 53.5290 1.3273
4 56.4923 1.4843
5 56.6679 3.2745
6 56.5164 1.7789
7 58.2352 1.1148
8 58.2353 0.6817
9 60.9896 1.3365
10 64.2063 2.3251

因為在每一行的遍歷中需要增加一次 file.tell(),所以單線程時的速度相較于直接讀取會更慢。

3. 多進程遍歷文件
from multiprocessing import Process

定義多進程遍歷函數(shù):

def multi_process_load_csv(path: str, n_process: int):
    """多進程遍歷函數(shù)"""
    size = os.path.getsize(path)  # 獲取文件大小用于分塊
    process_lst = []
    for i in range(n_process):
        s = size // n_process * i  # 計算當前分塊開始位置
        e = size // n_process * (i + 1)  # 計算當前分塊結束位置
        process = Process(target=read, args=(s, e))
        process.start()
        process_lst.append(process)
    for process in process_lst:
        process.join()

測試線程數(shù)為 1 - 10 之間的讀取時間,每種線程數(shù)測試 10 次,測試代碼及結果如下:

import numpy as np

for k in range(1, 11):
    use_time = []
    for _ in range(10):
        t1 = time.time()
        multi_process_load_csv("/home/txjiang/archive_analysis/gather_detail.txt", k)
        t2 = time.time()
        use_time.append(t2 - t1)
        print(f"線程={k} 平均時間={np.average(use_time)} 標準差={np.std(use_time)}")
進程數(shù) 用時的平均值 用時的標準差
1 50.1561 0.8431
2 26.5089 0.5581
3 17.7663 0.2771
4 13.4338 0.3024
5 10.7654 0.2950
6 9.1950 0.3471
7 7.7160 0.1764
8 7.0321 0.1938
9 6.3484 0.2150
10 5.6354 0.1271
11 5.1283 0.2361
12 4.7841 0.0512
13 4.5149 0.2186
14 4.1525 0.0533
15 3.9554 0.1442
16 3.8481 0.1167
17 3.6455 0.0763
18 3.4030 0.0255
19 3.3732 0.2159
20 3.1933 0.0674
21 3.0091 0.0845
22 2.9235 0.0646
23 2.9474 0.2234
24 2.7500 0.0382
25 2.6592 0.0340
26 2.5687 0.0333
27 2.6273 0.3457
28 2.4343 0.0253
29 2.3647 0.0223
30 2.2572 0.0343

因為在每一行的遍歷中需要增加一次 file.tell(),所以單進程時的速度相較于直接讀取會更慢。文章來源地址http://www.zghlxwxcb.cn/news/detail-699457.html

到了這里,關于Python 性能優(yōu)化|多線程讀取文件的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • Python爬蟲:單線程、多線程、多進程

    Python爬蟲:單線程、多線程、多進程

    在使用爬蟲爬取數(shù)據(jù)的時候,當需要爬取的數(shù)據(jù)量比較大,且急需很快獲取到數(shù)據(jù)的時候,可以考慮將單線程的爬蟲寫成多線程的爬蟲。下面來學習一些它的基礎知識和代碼編寫方法。 進程可以理解為是正在運行的程序的實例。進程是擁有資源的獨立單位,而線程不是獨立的

    2024年02月13日
    瀏覽(17)
  • 【python】13.進程和線程

    【python】13.進程和線程

    今天我們使用的計算機早已進入多CPU或多核時代,而我們使用的操作系統(tǒng)都是支持“多任務”的操作系統(tǒng),這使得我們可以同時運行多個程序,也可以將一個程序分解為若干個相對獨立的子任務,讓多個子任務并發(fā)的執(zhí)行,從而縮短程序的執(zhí)行時間,同時也讓用戶獲得更好的

    2024年01月17日
    瀏覽(23)
  • Python小姿勢 - 線程和進程:

    Python小姿勢 - 線程和進程:

    線程和進程: Python里面線程是真正的并行執(zhí)行,進程是可以并行執(zhí)行的。 所謂進程,就是操作系統(tǒng)中執(zhí)行一個程序的獨立單元,它是系統(tǒng)進行資源分配和調度的基本單位。一個進程可以創(chuàng)建和撤銷另一個進程,同一個進程內可以并發(fā)執(zhí)行多個不同的子程序。 所謂線程,是進

    2024年02月01日
    瀏覽(25)
  • chatgpt賦能python:Python倒序for:如何優(yōu)化循環(huán)遍歷

    Python作為一門高級編程語言,一直以來都在開發(fā)者中得到廣泛的應用。在日常的編程工作中,遍歷列表(List)和元組(Tuple)是很常見的操作。而對于列表或元組的倒序遍歷,開發(fā)者們可能還沒有找到最優(yōu)的解決方案。本文將分享一種高效的Python倒序for循環(huán)方式,讓您的代碼

    2024年02月07日
    瀏覽(25)
  • 【Python】多線程編程 ① ( 線程相關概念 | 進程 | 線程 | 協(xié)程 / 纖程 | 管程 )

    進程 與 操作系統(tǒng) : 進程 是 操作系統(tǒng) 中 能夠獨立運行的單元 , 是 操作系統(tǒng) 對 正在運行的 應用程序 的 抽象結構 描述 ; 操作系統(tǒng) 中 運行的每個 應用程序 就是一個進程 ; 一個操作系統(tǒng)中可以運行 多個 進程 ; 每個 應用程序 都會被 操作系統(tǒng) 分配一個 進程 ID ; 多個進程之間

    2024年02月15日
    瀏覽(25)
  • python多進程與多線程

    python多進程與多線程

    1.1 GIL 全局解釋器鎖 其他語言,CPU是多核時是支持多個線程同時執(zhí)行。但在Python中,無論是單核還是多核,同時只能由一個線程在執(zhí)行。其根源是GIL的存在。GIL的全稱是Global Interpreter Lock(全局解釋器鎖),來源是Python設計之初的考慮,為了數(shù)據(jù)安全所做的決定。某個線程想要執(zhí)

    2024年02月05日
    瀏覽(20)
  • Python多任務教程:進程、線程、協(xié)程

    Python多任務教程:進程、線程、協(xié)程

    進程是一個具有一定獨立功能的程序在一個數(shù)據(jù)集上的一次動態(tài)執(zhí)行的過程,是操作系統(tǒng)進行資源分配和調度的一個獨立單位,是應用程序運行的載體。進程是一種抽象的概念,從來沒有統(tǒng)一的標準定義。進程一般由程序、數(shù)據(jù)集合和進程控制塊三部分組成。程序用于描述進

    2024年02月12日
    瀏覽(31)
  • 8.0 Python 使用進程與線程

    python 進程與線程是并發(fā)編程的兩種常見方式。進程是操作系統(tǒng)中的一個基本概念,表示程序在操作系統(tǒng)中的一次執(zhí)行過程,擁有獨立的地址空間、資源、優(yōu)先級等屬性。線程是進程中的一條執(zhí)行路徑,可以看做是輕量級的進程,與同一個進程中的其他線程共享相同的地址空間

    2024年02月13日
    瀏覽(28)
  • python-16-線程池和進程池python并發(fā)編程

    python-16-線程池和進程池python并發(fā)編程

    Python ThreadPoolExecutor線程池 線程池的基本原理是什么? 利用Python快速實現(xiàn)一個線程池,非常簡單 Python并發(fā)編程專題 一、為什么要引入并發(fā)編程? 場景1:一個網絡爬蟲,按順序爬取花了1小時,采用并發(fā)下載減少到20分鐘! 場景2:一個APP應用,優(yōu)化前每次打開頁面需要3秒,采

    2024年02月04日
    瀏覽(43)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包