C を使用した Python コードの高速化 (追加のライブラリなし)

WBOY
リリース: 2024-08-21 15:47:02
オリジナル
1008 人が閲覧しました

注: もともと私のサブスタックに投稿されました: https://open.substack.com/pub/andresalvareziglesias/p/speeding-up-python-code-with-c-and

Python は速度のパラダイムではありません。これは誰もが知っています。しかし、古き良き友人 C の助けを借りて、アプリの重要な部分のいくつかを高速化することができます。

Speeding up Python code with C (and no extra libraries)

プレーン Python のフィボナッチ数列

フィボナッチ数列は、ソフトウェア開発を教えるために使用される古典的な例です。 0 と 1 で始まる一連の数値です。後続の各数値は、前の 2 つの数値の合計です。したがって、シーケンスは次のようになります: 0、1、1、2、3、5、8、13、21、34、...

次の方法で Python でフィボナッチを開発できます:

import time

# Configure iterations
iterations = 30

# Define fibonacci in native python
def fibonacci(n):
  if n <= 1:
    return n
  else:
    return fibonacci(n-1) + fibonacci(n-2)

# Calculate in pure python
start_time = time.perf_counter()
print(f"Calculating {iterations} iterations of fibonacci...")
print(fibonacci(iterations))
end_time = time.perf_counter()
execution_time_ms = (end_time - start_time) * 1000
print(f"Execution time: {execution_time_ms:.2f} milliseconds")
print()
ログイン後にコピー

この純粋な Python (Google IDX 仮想マシン内) バージョンのフィボナッチを実行すると、次の結果が得られます:

  • 10 回の反復: 5.77 ミリ秒
  • 30 回の反復: 984.36 ミリ秒
  • 50 回の反復: (プロセスをキャンセルする必要があります。時間がかかりすぎます)

C のフィボナッチ数列

同じシーケンスをプレーン C で開発できます:

#include <stdio.h>

int fibonacci(int n) {
    if (n <= 1) {
        return n;
    } else {
        return fibonacci(n - 1) + fibonacci(n - 2);
    }
}
ログイン後にコピー

GCC を使用してライブラリをコンパイルします:

gcc -o fibonacci.so -shared -fPIC -O2 fibonacci.c
ログイン後にコピー

これで、フィボナッチ数列関数を内部に持つネイティブ バイナリ ライブラリが完成しました。 ctypes (Python 自体は C で開発されているため、Python C タイプ ライブラリ) を使用して、このライブラリを Python アプリ内に埋め込むことができます。

import time
from ctypes import c_double, c_int, CDLL

# Configure iterations
iterations = 30

# Import the C library
library = CDLL('./fibonacci.so')
fibonacciAsLibrary = library.fibonacci
fibonacciAsLibrary.restype = c_int

# Calculate as C library
start_time = time.perf_counter()
print(f"Calculating {iterations} iterations of fibonacci as C library...")
print(fibonacciAsLibrary(iterations))
end_time = time.perf_counter()
execution_time_ms = (end_time - start_time) * 1000
print(f"Execution time: {execution_time_ms:.2f} milliseconds")
print()
ログイン後にコピー

ここで、このバージョンをフィボナッチで実行すると、次の結果が得られます:

  • 10 回の反復: 0.54 ミリ秒
  • 30 回の反復: 6.92 ミリ秒
  • 50 回の反復: 82324.90 ミリ秒

もっといいですよね?

Python と C の統合のユースケース

この種の統合は、次のような多くのアプリやシナリオで使用できます。

  • Django アプリのシリアライザーとデシリアライザーを高速化します
  • ワークフローの重要な部分を高速化します
  • OS との低レベルの対話
  • など

そしてあなたは?この小さなトリックをプロジェクトでどのように活用しますか?ぜひコメントをお待ちしています!

リストについて

Python と Docker の投稿のうち、次のような他の関連トピック (常にテクノロジーとプログラミングのトピックであることを約束します...厳禁) についても書きます。

  • ソフトウェア アーキテクチャ
  • プログラミング環境
  • Linux オペレーティング システム
  • など

何か興味深いテクノロジー、プログラミング言語などを見つけたら、ぜひ知らせてください。私はいつでも新しいことを学ぶことにオープンです!

著者について

私はアンドレスです。パルマに拠点を置くフルスタック ソフトウェア開発者で、コーディング スキルを向上させるために個人的な旅を続けています。私は自費出版のファンタジー作家でもあり、自分の名前で 4 冊の小説を出版しています。何でもお気軽に聞いてください!

以上がC を使用した Python コードの高速化 (追加のライブラリなし)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!