コードの3行のみなので、Pythonのスピード4倍!ほとんどの援助

Pythonはプログラミング言語を完了するために、データ処理や繰り返し作業の自動化に非常に適しています。Pythonは、このような数十の画像の何千ものの大きさを再調整する必要があるとして、仕事のために非常に適している間、私たちは、通常、データの前処理を必要とするトレーニング機械学習モデルの前にデータを使用して、Pythonの持つ問題はありません!あなたは、ほとんどの場合、簡単にデータ処理作業を完了することができますPythonライブラリを見つけることができます。

Pythonは、習得が容易で使いやすいですが、それは最速の言語ではありませんが。デフォルトでは、Pythonのは、1つのプロセスで実行されているCPUを使用しています。あなたが近年のコンピュータの構成である場合には、通常、クアッドコアプロセッサ、つまり、4つのCPUがあります。これは、データ処理のためのPythonスクリプトを待っているとき、コンピュータが実際にそのことについて、アイドリング中のコンピューティングリソースの75%以上であることを意味します!

今日、我々は、Pythonの関数を並列に実行することにより、コンピュータのすべての処理能力を最大限に活用する方法を教えます。concurrent.futuresのPythonモジュールのおかげで、私たちはコードのわずか3行が必要、あなたは一般的なデータ処理スクリプトスクリプトになることができるようになりますが、平行、速度は4倍のデータを処理することができます!

通常のデータ処理方法のPython

▲▲▲

Pythonの各画像のサムネイルを作成するために、我々は、画像データの完全なファイルフォルダを持っているとしましょう。

ここで、フォルダ内のすべてのJPEG画像ファイルのリストのための短いスクリプトは、Pythonのglob関数を内蔵し、その後128個のピクセルのサムネイルサイズとして各画像を保存するために枕画像処理ライブラリを使用します。

在学习过程中有什么不懂得可以加我的
python学习交流扣扣qun,784758214
群里有不错的学习视频教程、开发工具与电子书籍。
与你分享python企业当下人才需求及怎么从零基础学习好python,和学习什么内容
import globimport osfrom PIL import Imagedef make_image_thumbnail(filename):
    # 缩略图会被命名为"<original_filename>_thumbnail.jpg"
    base_filename, file_extension = os.path.splitext(filename)
    thumbnail_filename = f"{base_filename}_thumbnail{file_extension}"

    # 创建和保存缩略图
    image = Image.open(filename)
    image.thumbnail(size=(128, 128))
    image.save(thumbnail_filename, "JPEG")    return thumbnail_filename# 循环文件夹中所有JPEG图像,为每张图像创建缩略图for image_file in glob.glob("*.jpg"):
    thumbnail_file = make_image_thumbnail(image_file)

print(f"A thumbnail for {image_file} was saved as {thumbnail_file}")

コードの3行のみなので、Pythonのスピード4倍! ほとんどの援助

スクリプトは、単純なパターンに従って、あなたは、多くの場合、データ処理スクリプトでこの方法が表示されます。

  • まず、あなたが処理したいファイル(またはその他のデータ)のリストを取得します

  • 上記1つのデータファイルを扱うことのできるヘルパー関数

  • 補助機能は、個々のデータの処理を一度に1つずつ、ループを必要とします。

このスクリプトをテストするためにJPEG画像クリップが含まれている1000年のファイルは、なくなると、それにかかる時間を参照してください。

$ time python3 thumbnails_1.py
A thumbnail for 1430028941_4db9dedd10.jpg was saved as 1430028941_4db9dedd10_thumbnail.jpg
[... about 1000 more lines of output ...]real 0m8.956s
user 0m7.086s
sys 0m0.743s

コードの3行のみなので、Pythonのスピード4倍! ほとんどの援助

これは、プログラムを実行するために8.9秒かかりましたが、どのように実際の作業強度コンピュータを行いますか?

私たちは、その後のプログラムが実行された場合にアクティビティモニタのケースを見てもう一度プログラムを実行します。

コードの3行のみなので、Pythonのスピード4倍! ほとんどの援助

コードの3行のみなので、Pythonのスピード4倍! ほとんどの援助

コンピュータの処理リソースの75%はアイドル状態です!状況は何ですか?

この理由は、私のコンピュータは4 CPUを持っているということですが、唯一のPythonを使用しています。だから、プログラムは単に強度を勢揃いされ、CPUが、3さらに何もありません。私は、したがって、4つの別個の部分Iの並列処理に分割されて作業することが可能な方法が必要。幸いにも、Pythonは非常に簡単な方法は私たちが行うことができますがあります!

マルチプロセスを作成しよう

▲▲▲

ここで私たちは、並列にデータを処理することを可能にする方法は次のとおりです。

図1に示すように、JPEGファイルが4個に分割されています。Pythonインタプリタを実行する図2に示すように、4つの別々のインスタンス。3、プロセスように、各パイソン4ブロックデータの一例。図4に示すように、合併のこれらの処理部4の結果は、結果の最終的なリストが得られます。

パイソンの4つのコピーは、ワークロードは、右、についてですCPUよりも4倍高い処理することができる必要があり、4つの別々のCPU上で実行されますか?

すべてのベストは、Pythonは仕事の最も厄介な部分という私たちのために行っています。私達はちょうどそれがライン上で機能しているの使用のインスタンスを実行し、どのように多くしたいと伝える必要があり、それが残りの作業を完了します。私達はちょうど3行のコードの全過程を変更する必要があります。

まず第一に、我々はあなたがPythonで構築されたconcurrent.futuresライブラリをインポートする必要があります。

import concurrent.futures

コードの3行のみなので、Pythonのスピード4倍! ほとんどの援助

次に、我々は、Pythonの起動に4つの追加Pythonの例を指示する必要があります。私たちは、Pythonのプロセスプールを作成することによって、次の操作を行います。

with concurrent.futures.ProcessPoolExecutor() as executor:

コードの3行のみなので、Pythonのスピード4倍! ほとんどの援助

デフォルトでは、それはあなたのコンピュータ上の各CPU用のPythonプロセスを作成しますので、あなたは4 CPUを持っている場合、Pythonは4つのプロセスを開始します。

最後のステップは、プロセスプールは、データリストに私たちのヘルパー関数を実行するこれらの4つのプロセスで作成できるようにすることです。私たちはループのために持っている必要があり、これを実行します。

for image_file in glob.glob("*.jpg"):
thumbnail_file = make_image_thumbnail(image_file)

コードの3行のみなので、Pythonのスピード4倍! ほとんどの援助

新しいコールexecutor.mapに置き換え():

image_files = glob.glob("*.jpg")for image_file, thumbnail_file in zip(image_files, executor.map(make_image_thumbnail, image_files)):

コードの3行のみなので、Pythonのスピード4倍! ほとんどの援助

executor.map()関数呼び出しは、補助データ処理すべき機能のリストを入力します。この機能は、など、リストを含むすべての問題、の仕事は、複数のサブリストに分割され、サブリストは、それぞれの子プロセスに送信され、子プロセスが実行され、結果をマージされて完了するために、私を助けることができます よくやりました!

また、私たちのために、各関数呼び出しの結果を返すことができます。Executor.map()関数は、同程度の結果に応じて入力されたデータを返します。だから私は一歩は、元のファイル名と内のすべてのステップに一致し得るためのショートカットとしてPythonのジッパー()関数を使用していました。

ここでは、プログラムコードのこの変更後の3ステップは次のとおりです。

import globimport osfrom PIL import Imageimport concurrent.futuresdef make_image_thumbnail(filename):
    # 缩略图会被命名为 "<original_filename>_thumbnail.jpg"
    base_filename, file_extension = os.path.splitext(filename)
    thumbnail_filename = f"{base_filename}_thumbnail{file_extension}"

    # 创建和保存缩略图
    image = Image.open(filename)
    image.thumbnail(size=(128, 128))
    image.save(thumbnail_filename, "JPEG")    return thumbnail_filename# 创建Process Pool,默认为电脑的每个CPU创建一个with concurrent.futures.ProcessPoolExecutor() as executor:    # 获取需要处理的文件列表
    image_files = glob.glob("*.jpg")    # 处理文件列表,但通过Process Pool划分工作,使用全部CPU!
    for image_file, thumbnail_file in zip(image_files, executor.map(make_image_thumbnail, image_files)):
        print(f"A thumbnail for {image_file} was saved as {thumbnail_file}")

コードの3行のみなので、Pythonのスピード4倍! ほとんどの援助

私たちは、このスクリプトを実行し、データ処理を完了するために、より高速であるかどうかを確認します。

在学习过程中有什么不懂得可以加我的
python学习交流扣扣qun,784758214
群里有不错的学习视频教程、开发工具与电子书籍。
与你分享python企业当下人才需求及怎么从零基础学习好python,和学习什么内容
$ time python3 thumbnails_2.py
A thumbnail for 1430028941_4db9dedd10.jpg was saved as 1430028941_4db9dedd10_thumbnail.jpg
[... about 1000 more lines of output ...]real 0m2.274s
user 0m8.959s
sys 0m0.951s

コードの3行のみなので、Pythonのスピード4倍! ほとんどの援助

スクリプトは、データの取り扱いに2.2秒で終了しました!元のバージョンよりも4倍速いスピード!我々は1の代わりに4つのCPUを使用するので、より高速なデータを処理することができました。

あなたは慎重に見ている場合でも、あなたは、「ユーザー」の時間にはほぼ9秒を見つけるでしょう。なぜプログラム処理2.2秒の時間が、私はに従事する方法がわからない、または9秒の時間を実行していますか?これは、ああそうにありませんか?

「ユーザー」CPU時間はすべての時間の合計があるためである、私たちは、仕事を仕上げる9秒ですが、我々は、4つの完全なCPUを使用すると、合計CPU時間、わずか2.2秒の実際のデータ処理時間!

注意:より多くのPythonのプロセスを有効にしてデータを配信することは子供に時間を要し、そのためこの方法に頼る常にスピードの大幅な増加を保証するものではありません。

いつも私は、スクリプトが実行するデータ処理をスピードアップ?

あなたがプログラミングの世界ではまだ混乱している場合は、Pythonのバックルqun学ぶために私たちに参加することができます:784758214を、高齢者が学んでいる方法を見て。経験の交換。基本的なWeb開発Pythonスクリプトから、爬虫類、ジャンゴ、データマイニングや他のプロジェクトへのゼロベースのデータを戦うために仕上げています。どんな小さなPythonのパートナーに与えられました!、学習と細部に注意を払う必要がありますいくつかの方法を共有してご参加くださいをクリックしてPythonの学習者の集まり
▲▲

あなたはデータの列があり、各データは、我々がここで話しているの良いアプローチを使用して、個別に処理することができればスピードのプロセスプールです。ここでは、並列処理を使用するためのいくつかの例は以下のとおりです。

  • 別のWebサーバログのシリーズからクロールの統計情報。

  • XML、CSVおよびJSONファイルの束からのデータを解析します。

  • 画像データの前処理の数が多い、機械学習データセットの確立。

しかし、我々はプロセスプールは万能薬ではない、覚えておいてください。使用プロセスのプールは、前後に別のPythonの処理プロセス間でデータを渡す必要があります。あなたが効果的にプロセスに転送することができないデータを処理したい場合は、このアプローチは動作しません。要するに、データはあなたのタイプに対処する方法を知っているのPythonを処理する必要があります。

一方、データは、期待シーケンスに従って処理することができません。あなたが次のステップの結果の前にさらに処理が必要な場合は、このアプローチは動作しません。

これGILの問題?

▲▲▲

あなたは、Pythonのグローバルインタプリタロックという男(グローバルインタプリタロック)のもの、すなわち、GILを知っているかもしれません。これは、アプリケーションがマルチスレッドの場合でも、各スレッドが唯一のPythonコマンドを実行できることを意味します。GILは唯一のPythonのスレッドすべての回でそれを確認してください。言い換えれば、マルチスレッドのPythonコードは本当にマルチコアCPUをフルに活用することができない、並列に実行されません。

しかし、プロセスのプールは、この問題を解決することができます!私たちは別のPythonのインスタンスを実行しているので、各インスタンスは独自のGILを持っています。Pythonコード我々が得るように、真の並列処理であります!

並列処理を恐れてはいけません!

▲▲▲

concurrent.futuresライブラリーでは、Pythonはあなたが単純にスクリプトを変更することができます、すぐに仕事に、コンピュータ上のすべてのCPUをしましょう。あなたはループのため、それは同じように簡単に習得した後、この方法を試すことを恐れてはいけないが、それは彼のダンスを来て、あなたのデータ処理スクリプトを作ることができます。

おすすめ

転載: blog.51cto.com/14510224/2438069