PyPyとCPythonの性能比較テスト
最近、Wikipedia でいくつかのデータ マイニング タスクを完了しました。これは次の部分で構成されます:
enwiki-pages-articles.xml の Wikipedia ダンプを解析する;
カテゴリとページを MongoDB に保存する;
カテゴリ名を再分類する。
実際のタスクで CPython 2.7.3 と PyPy 2b のパフォーマンスをテストしました。私が使用したライブラリは次のとおりです:
redis 2.7.2
pymongo 2.4.2
また、CPython は次のライブラリでもサポートされています:
hiredis
pymongo c-extensions
テストは主にデータベースの解析で構成されているため、 PyPy からどれだけのメリットが得られるかは予想していませんでした (CPython のデータベース ドライバーが C で書かれていることは言うまでもありません)。
以下にいくつかの興味深い結果について説明します。
Wikiページ名を抽出します
すべてのWikipediaカテゴリのpage.idへのWikiページ名の結合を作成し、再割り当てされたものを保存する必要があります。最も簡単な解決策は、enwiki-page.sql (RDB テーブルを定義する) を MySQL にインポートし、データを転送して再配布することです。しかし、MySQL の要件を増やしたくなかったので (バックボーンが必要です! XD)、純粋な Python で単純な SQL 挿入ステートメント パーサーを作成し、データを enwiki-page.sql から直接インポートして再配布しました。
このタスクは CPU への依存度が高いため、私は PyPy について再び楽観的です。
/ time
PyPy 169.00s ユーザーモード 8.52s システムモード 90% CPU
CPython 1287.13s ユーザーモード 8.10s システムモード 96% CPU
また、page.id->category に対しても同様の結合を行いました (Iラップトップのメモリが小さすぎて、テスト用の情報を保持できません)。
enwiki からカテゴリをフィルターします。したがって、PyPy と CPython の両方で動作するラッパー パーサーである SAX パーサーを選択しました。外部ネイティブ コンパイル パッケージ (PyPy および CPython の同僚)。
コードは非常にシンプルです:
class WikiCategoryHandler(handler.ContentHandler): """Class which detecs category pages and stores them separately """ ignored = set(('contributor', 'comment', 'meta')) def __init__(self, f_out): handler.ContentHandler.__init__(self) self.f_out = f_out self.curr_page = None self.curr_tag = '' self.curr_elem = Element('root', {}) self.root = self.curr_elem self.stack = Stack() self.stack.push(self.curr_elem) self.skip = 0 def startElement(self, name, attrs): if self.skip>0 or name in self.ignored: self.skip += 1 return self.curr_tag = name elem = Element(name, attrs) if name == 'page': elem.ns = -1 self.curr_page = elem else: # we don't want to keep old pages in memory self.curr_elem.append(elem) self.stack.push(elem) self.curr_elem = elem def endElement(self, name): if self.skip>0: self.skip -= 1 return if name == 'page': self.task() self.curr_page = None self.stack.pop() self.curr_elem = self.stack.top() self.curr_tag = self.curr_elem.tag def characters(self, content): if content.isspace(): return if self.skip == 0: self.curr_elem.append(TextElement(content)) if self.curr_tag == 'ns': self.curr_page.ns = int(content) def startDocument(self): self.f_out.write("<root>\n") def endDocument(self): self.f_out.write("<\root>\n") print("FINISH PROCESSING WIKIPEDIA") def task(self): if self.curr_page.ns == 14: self.f_out.write(self.curr_page.render()) class Element(object): def __init__(self, tag, attrs): self.tag = tag self.attrs = attrs self.childrens = [] self.append = self.childrens.append def __repr__(self): return "Element {}".format(self.tag) def render(self, margin=0): if not self.childrens: return u"{0}<{1}{2} />".format( " "*margin, self.tag, "".join([' {}="{}"'.format(k,v) for k,v in {}.iteritems()])) if isinstance(self.childrens[0], TextElement) and len(self.childrens)==1: return u"{0}<{1}{2}>{3}</{1}>".format( " "*margin, self.tag, "".join([u' {}="{}"'.format(k,v) for k,v in {}.iteritems()]), self.childrens[0].render()) return u"{0}<{1}{2}>\n{3}\n{0}</{1}>".format( " "*margin, self.tag, "".join([u' {}="{}"'.format(k,v) for k,v in {}.iteritems()]), "\n".join((c.render(margin+2) for c in self.childrens))) class TextElement(object): def __init__(self, content): self.content = content def __repr__(self): return "TextElement" def render(self, margin=0): return self.content
私はかつて、アプリケーションの 1 つのコンテキストで、コンピューティング カテゴリから派生したいくつかのカテゴリから始めて、興味深いカテゴリのセットを計算したいと考えていました。これを行うには、クラスを提供するクラス図、つまりサブクラス図を構築する必要があります。
構造クラスとサブクラスの関係図
このタスクは、MongoDB をデータ ソースとして使用し、構造を再配布します。アルゴリズムは次のとおりです:
for each category.id in redis_categories (it holds *category.id -> category title mapping*) do: title = redis_categories.get(category.id) parent_categories = mongodb get categories for title for each parent_cat in parent categories do: redis_tree.sadd(parent_cat, title) # add to parent_cat set title
このような疑似コードを書いて申し訳ありませんが、もっとコンパクトに見せたいのです。
redis_tree (再配布ツリー) の走査
redis_tree データベースがある場合、残る唯一の問題は、[コンピューティング] カテゴリの下にあるすべての達成可能なノードを走査することです。ループトラバーサルを回避するには、訪問したノードを記録する必要があります。 Python のデータベースのパフォーマンスをテストしたかったので、コレクション列を再配布することでこの問題を解決しました。
/ time
結論
実施されたテストは、私の最終的な作業のプレビューにすぎません。それには一連の知識、つまりウィキペディアから適切なコンテンツを抽出して得た一連の知識が必要です。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









PHPとPythonには独自の利点と短所があり、選択はプロジェクトのニーズと個人的な好みに依存します。 1.PHPは、大規模なWebアプリケーションの迅速な開発とメンテナンスに適しています。 2。Pythonは、データサイエンスと機械学習の分野を支配しています。

Pytorch GPUアクセラレーションを有効にすることで、CentOSシステムでは、PytorchのCUDA、CUDNN、およびGPUバージョンのインストールが必要です。次の手順では、プロセスをガイドします。CUDAおよびCUDNNのインストールでは、CUDAバージョンの互換性が決定されます。NVIDIA-SMIコマンドを使用して、NVIDIAグラフィックスカードでサポートされているCUDAバージョンを表示します。たとえば、MX450グラフィックカードはCUDA11.1以上をサポートする場合があります。 cudatoolkitのダウンロードとインストール:nvidiacudatoolkitの公式Webサイトにアクセスし、グラフィックカードでサポートされている最高のCUDAバージョンに従って、対応するバージョンをダウンロードしてインストールします。 cudnnライブラリをインストールする:

PythonとJavaScriptには、コミュニティ、ライブラリ、リソースの観点から、独自の利点と短所があります。 1)Pythonコミュニティはフレンドリーで初心者に適していますが、フロントエンドの開発リソースはJavaScriptほど豊富ではありません。 2)Pythonはデータサイエンスおよび機械学習ライブラリで強力ですが、JavaScriptはフロントエンド開発ライブラリとフレームワークで優れています。 3)どちらも豊富な学習リソースを持っていますが、Pythonは公式文書から始めるのに適していますが、JavaScriptはMDNWebDocsにより優れています。選択は、プロジェクトのニーズと個人的な関心に基づいている必要があります。

DockerはLinuxカーネル機能を使用して、効率的で孤立したアプリケーションランニング環境を提供します。その作業原則は次のとおりです。1。ミラーは、アプリケーションを実行するために必要なすべてを含む読み取り専用テンプレートとして使用されます。 2。ユニオンファイルシステム(UnionFS)は、違いを保存するだけで、スペースを節約し、高速化する複数のファイルシステムをスタックします。 3.デーモンはミラーとコンテナを管理し、クライアントはそれらをインタラクションに使用します。 4。名前空間とcgroupsは、コンテナの分離とリソースの制限を実装します。 5.複数のネットワークモードは、コンテナの相互接続をサポートします。これらのコア概念を理解することによってのみ、Dockerをよりよく利用できます。

MINIOオブジェクトストレージ:CENTOSシステムの下での高性能展開Minioは、Amazons3と互換性のあるGO言語に基づいて開発された高性能の分散オブジェクトストレージシステムです。 Java、Python、JavaScript、Goなど、さまざまなクライアント言語をサポートしています。この記事では、CentosシステムへのMinioのインストールと互換性を簡単に紹介します。 Centosバージョンの互換性Minioは、Centos7.9を含むがこれらに限定されない複数のCentosバージョンで検証されています。

Pytorchの分散トレーニングでは、Centosシステムでトレーニングには次の手順が必要です。Pytorchのインストール:PythonとPipがCentosシステムにインストールされていることです。 CUDAバージョンに応じて、Pytorchの公式Webサイトから適切なインストールコマンドを入手してください。 CPUのみのトレーニングには、次のコマンドを使用できます。PipinstalltorchtorchtorchvisionTorchaudioGPUサポートが必要な場合は、CUDAとCUDNNの対応するバージョンがインストールされ、インストールに対応するPytorchバージョンを使用してください。分散環境構成:分散トレーニングには、通常、複数のマシンまたは単一マシンの複数GPUが必要です。場所

PytorchをCentosシステムにインストールする場合、適切なバージョンを慎重に選択し、次の重要な要因を検討する必要があります。1。システム環境互換性:オペレーティングシステム:Centos7以上を使用することをお勧めします。 Cuda and Cudnn:PytorchバージョンとCudaバージョンは密接に関連しています。たとえば、pytorch1.9.0にはcuda11.1が必要ですが、pytorch2.0.1にはcuda11.3が必要です。 CUDNNバージョンは、CUDAバージョンとも一致する必要があります。 Pytorchバージョンを選択する前に、互換性のあるCUDAおよびCUDNNバージョンがインストールされていることを確認してください。 Pythonバージョン:Pytorch公式支店

PytorchをCentosの最新バージョンに更新すると、次の手順に従うことができます。方法1:PIPでPIPを更新する:最初にPIPが最新バージョンであることを確認します。これは、PIPの古いバージョンがPytorchの最新バージョンを適切にインストールできない可能性があるためです。 pipinstall- upgradepipアンインストール古いバージョンのpytorch(インストールの場合):pipuninstorchtorchtorchvisiontorchaudioインストール最新
