Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk menyelesaikan ralat operasi IO yang terlalu kerap dalam kod Python?

Bagaimana untuk menyelesaikan ralat operasi IO yang terlalu kerap dalam kod Python?

王林
王林asal
2023-06-24 20:49:441353semak imbas

Python, sebagai bahasa pengaturcaraan peringkat tinggi, mempunyai pelbagai aplikasi dalam pemprosesan data dan program komputer. Walau bagaimanapun, apabila melakukan operasi data yang kompleks, kod Python terdedah kepada masalah prestasi yang disebabkan oleh operasi IO yang kerap. Dalam artikel ini, kami akan memperkenalkan cara menyelesaikan ralat operasi IO yang terlalu kerap dalam kod Python.

  1. Cache operasi IO

Apabila program Python menjalankan operasi IO, data mesti dibaca daripada cakera atau peranti storan lain, yang akan menyebabkan operasi IO yang kerap dan dengan itu menjejaskan prestasi program. Untuk mengelakkan perkara ini daripada berlaku, kita boleh menggunakan operasi IO yang dicache.

Caching operasi IO merujuk kepada caching hasil operasi IO ke dalam memori dan bukannya membaca data dari cakera setiap kali. Caching operasi IO boleh meningkatkan prestasi program kerana ia mengurangkan bilangan kali program mengakses cakera.

Sebagai contoh, kod berikut menunjukkan cara menggunakan operasi IO yang dicache untuk membaca data daripada fail:

import functools

@functools.lru_cache(maxsize=128)
def read_file(filename):
    with open(filename) as f:
        return f.read()

Dalam contoh ini, fungsi lru_cache() digunakan untuk cache hasil fungsi . Apabila fungsi dipanggil buat kali pertama, hasilnya akan dicache dalam ingatan. Apabila fungsi dipanggil semula, jika parameter tidak berubah, hasilnya akan diambil daripada cache dan bukannya membaca data dari cakera. lru_cache()函数被用来缓存函数的结果。当函数第一次被调用时,它的结果将会被缓存到内存中。当函数再次被调用时,如果参数没有变化,结果将从缓存中取回而不是从磁盘读取数据。

  1. 使用内存映射文件

内存映射文件是指将文件映射到进程的内存空间中,以便可以像操作内存一样访问文件。使用内存映射文件可以避免频繁的IO操作,特别是当处理大量数据时。

下面的代码展示了如何使用内存映射文件读取大型CSV文件:

import mmap
import csv

def read_csv(filename):
    with open(filename, "rb") as csv_file:
        with mmap.mmap(csv_file.fileno(), 0, access=mmap.ACCESS_READ) as csv_data:
            reader = csv.reader(iter(csv_data.readline, b""))
            for row in reader:
                # do something with row

在这个例子中,mmap()函数被用来将文件映射到进程的内存空间中。然后,csv.reader()函数被用来读取CSV文件中的每一行。由于文件已经被映射到内存中,因此读取数据时不需要任何IO操作,因此程序的性能得到了很大的提升。

  1. 批量读取数据

另一种减少IO操作频率的解决方案是批量读取数据。这意味着一次读取多个数据,而不是每次读取一个数据。

例如,假设我们有一个包含1000个整数的文件。如果我们需要将文件中的所有整数加起来,我们可以使用下面的代码:

total = 0
with open("data.txt") as f:
    for line in f:
        total += int(line)

但是,这种做法会频繁地从磁盘读取数据,从而影响程序性能。相反,我们可以使用下面的代码一次性批量读取数据:

with open("data.txt") as f:
    data = f.read().splitlines()
total = sum(map(int, data))

在这个例子中,read()函数被用来一次性读取整个文件。然后,splitlines()函数被用来将文件内容分割成行,并存储在一个列表中。最后,map()函数被用来将每个行转换成整数,并计算它们的总和。这种方法可以减少IO操作频率,提高程序的性能。

  1. 使用异步IO操作

异步IO操作是指在执行IO操作时,程序可以同时执行其他任务。与传统的同步IO操作(在执行IO操作时程序必须等待IO操作完成然后才能继续执行其他任务)不同,异步IO操作可以提高程序的并发性和吞吐量。

Python 3.4引入了asyncio库,它提供了一种方便的方式来执行异步IO操作。下面是一个使用asyncio库读取URL内容的例子:

import asyncio
import aiohttp

async def fetch_url(url):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as response:
            return await response.text()

async def main():
    urls = [...]
    tasks = []
    for url in urls:
        tasks.append(asyncio.ensure_future(fetch_url(url)))
    results = await asyncio.gather(*tasks)
    # do something with results

asyncio.run(main())

在这个例子中,fetch_url()函数被用来异步读取URL内容。然后,main()

    Gunakan fail dipetakan memori

    🎜Fail dipetakan memori rujuk pada pemetaan fail ke dalam ruang memori proses supaya fail boleh diakses seperti memori. Menggunakan fail yang dipetakan memori boleh mengelakkan operasi IO yang kerap, terutamanya apabila memproses sejumlah besar data. 🎜🎜Kod berikut menunjukkan cara membaca fail CSV yang besar menggunakan fail yang dipetakan memori: 🎜rrreee🎜Dalam contoh ini, fungsi mmap() digunakan untuk memetakan fail ke dalam ruang memori proses. Kemudian, fungsi csv.reader() digunakan untuk membaca setiap baris dalam fail CSV. Memandangkan fail telah dipetakan ke dalam ingatan, tiada operasi IO diperlukan semasa membaca data, jadi prestasi program bertambah baik. 🎜
      🎜Baca data dalam kelompok🎜🎜🎜Satu lagi penyelesaian untuk mengurangkan kekerapan operasi IO ialah membaca data dalam kelompok. Ini bermakna membaca berbilang data sekaligus dan bukannya membaca satu data pada satu masa. 🎜🎜Sebagai contoh, katakan kita mempunyai fail yang mengandungi 1000 integer. Jika kita perlu menambah semua integer dalam fail, kita boleh menggunakan kod berikut: 🎜rrreee🎜 Walau bagaimanapun, pendekatan ini akan kerap membaca data daripada cakera, sekali gus menjejaskan prestasi program. Sebaliknya, kita boleh menggunakan kod berikut untuk membaca data dalam kelompok sekali gus: 🎜rrreee🎜Dalam contoh ini, fungsi read() digunakan untuk membaca keseluruhan fail sekaligus. Kemudian, fungsi splitlines() digunakan untuk memisahkan kandungan fail kepada baris dan menyimpannya dalam senarai. Akhir sekali, fungsi map() digunakan untuk menukar setiap baris kepada integer dan mengira jumlahnya. Kaedah ini boleh mengurangkan kekerapan operasi IO dan meningkatkan prestasi program. 🎜
        🎜Gunakan operasi IO tak segerak🎜🎜🎜Operasi IO tak segerak bermakna apabila melakukan operasi IO, atur cara boleh melaksanakan tugas lain pada masa yang sama. Tidak seperti operasi IO segerak tradisional (apabila menjalankan operasi IO, program mesti menunggu operasi IO selesai sebelum meneruskan melaksanakan tugas lain), operasi IO tak segerak boleh meningkatkan keselarasan dan daya pemprosesan program. 🎜🎜Python 3.4 memperkenalkan perpustakaan asyncio, yang menyediakan cara mudah untuk melaksanakan operasi IO tak segerak. Berikut ialah contoh menggunakan perpustakaan asyncio untuk membaca kandungan URL: 🎜rrreee🎜Dalam contoh ini, fungsi fetch_url() digunakan untuk membaca kandungan URL secara tidak segerak . Kemudian, fungsi main() digunakan untuk melaksanakan berbilang operasi IO tak segerak secara serentak dan memproses keputusan selepas semua operasi selesai. Menggunakan operasi IO tak segerak boleh mengelakkan operasi IO yang terlalu kerap dan meningkatkan prestasi program. 🎜🎜Dalam ringkasan, kami memperkenalkan cara menyelesaikan ralat operasi IO yang terlalu kerap dalam kod Python. Menggunakan teknologi seperti operasi IO yang dicache, fail yang dipetakan memori, bacaan kumpulan data dan operasi IO tak segerak boleh mengurangkan kekerapan operasi IO dengan berkesan, meningkatkan prestasi program dan mengelakkan ralat yang disebabkan oleh operasi IO. Sebagai pengaturcara Python, kita harus mengetahui teknik ini dan menggunakannya apabila diperlukan. 🎜

Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan ralat operasi IO yang terlalu kerap dalam kod Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn