「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > パフォーマンス トラップ: 一般ライブラリとヘルパー オブジェクト

パフォーマンス トラップ: 一般ライブラリとヘルパー オブジェクト

2024 年 11 月 2 日に公開
ブラウズ:128

利便性とパフォーマンスは通常、逆相関します。コードが使いやすい場合は、あまり最適化されていません。最適化すると利便性が低下します。効率的なコードは、実際に何がどのように実行されているかの核心的な詳細に近づく必要があります。

私は、癌研究のために DeepCell 細胞セグメンテーションを実行および最適化するという進行中の作業の中で、一例を見つけました。 DeepCell AI モデルは、どのピクセルがセル内に存在する可能性が最も高いかを予測します。そこから、セルの境界 (あるしきい値より下) に到達するまで、最も可能性の高いピクセルから「塗りつぶし」を行います。

このプロセスの一部には、予測された細胞内の小さなギャップを滑らかにすることが含まれます。これはさまざまな理由で発生する可能性がありますが、生物学的には不可能です。 (細胞の多孔質膜ではなく、ドーナツの穴を考えてください。)

穴埋めアルゴリズムは次のようになります:

  • オブジェクト (同じ数値 ID を持つ特定のセル ラベルを持つ連続したピクセル) を識別します。
  • これらのセルの「オイラー数」、つまり形状の表面の尺度を計算します。
  • オイラー数が 1 未満の場合 (サーフェスにギャップがある場合)、穴を滑らかにします。

ウィキペディアの記事からのオイラー数の例を次に示します。円 (線部分のみ) のオイラー特性は 0 ですが、円盤 (「塗りつぶされた」円) の値は 1 です。

Performance trap: general libraries & helper objects

ただし、オイラー数の定義や計算について話すためにここにいるわけではありません。オイラー数を計算するためのライブラリの簡単な方法がいかに非効率的であるかについて説明します。

まず最初に。 Speedscope:

を使用してこのプロファイルを確認することで問題に気づきました。

Performance trap: general libraries & helper objects

regionprops で約 32 ミリ秒 (約 15%) が費やされたことが示されています。このビューは左に偏っています。タイムライン ビューに移動してズームインすると、次のようになります:

Performance trap: general libraries & helper objects

(これを 2 回行うため、ここでは ~16ms、他の場所では ~16ms になることに注意してください。)

これはすぐに疑わしいです。find_objects でオブジェクトを見つける際の「興味深い」部分は、最初の 0.5 ミリ秒です。ジェネレーターではなくタプルのリストを返すので、それが完了したら完了です。それで、他のものはどうなっているのでしょうか?私たちは、RegionProperties オブジェクトを構築しています。そのうちの 1 つを拡大してみましょう。

Performance trap: general libraries & helper objects

小さな部分 (拡大しません) はカスタム __setattr__ 呼び出しです。RegionProperties オブジェクトはエイリアシングをサポートしています。たとえば、属性 ConvexArea を設定すると、標準属性 area_convex にリダイレクトされます。それを利用していないにもかかわらず、属性コンバーターを通過します。

さらに: 領域プロパティで計算されたプロパティのほとんどは使用されていません。オイラー数のみを考慮します:

props = regionprops(np.squeeze(label_img.astype('int')), cache=False)
for prop in props:
    if prop.euler_number 



次に、これは領域プロパティの最も基本的な側面、つまり find_objects によって検出された画像領域 (元の画像のスライス) のみを使用します。

そこで、コードを fill_holes コードに変更して、regionprops 汎用関数を単純にバイパスしました。代わりに、find_objects を呼び出し、結果の画像サブ領域を euler_number 関数 (RegionProperties オブジェクトのメソッドではありません) に渡します。

プル リクエストは次のとおりです: deepcell-imaging#358 領域プロパティの構築をスキップします

中間オブジェクトをスキップすることで、fill_holes 操作のパフォーマンスが大幅に向上しました:

画像サイズ 前に スピードアップ
260,000 ピクセル 48ミリ秒 40ミリ秒 8ms (17%)
1億4,000万画素 15.6秒 11.7秒 3.9秒 (25%)

大きな画像では、4 秒は全体の実行時間の約 3% であり、大部分ではありませんが、それほど粗末でもありません。

リリースステートメント この記事は次の場所に転載されています: https://dev.to/dchaley/performance-trap-general-libraries-helper-objects-h2k?1 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>
  • 項目 他の型の方が適している場合は文字列を避ける
    項目 他の型の方が適している場合は文字列を避ける
    1.他のデータ型の代わりに文字列を使用することは避けてください: 文字列はテキストを表すように設計されていますが、数値、列挙型、または集合構造を表すために誤用されることがよくあります。 データが本質的に数値である場合は、String. ではなく、int、float、BigInteger などの型を...
    プログラミング 2024 年 11 月 2 日に公開
  • sync.WaitGroup を使用して Go 同時実行でデッドロックを防ぐ方法
    sync.WaitGroup を使用して Go 同時実行でデッドロックを防ぐ方法
    ゴルーチンのデッドロックの解決このシナリオでは、Go 同時実行コードでデッドロック エラーが発生しました。問題を詳しく調べて、効率的な解決策を提供しましょう。このエラーは、プロデューサとコンシューマの動作の不一致が原因で発生します。プロデューサー関数に実装されたプロデューサーは、限られた期間、チャネ...
    プログラミング 2024 年 11 月 2 日に公開
  • テキスト ファイル内の Unicode テキストを処理する方法: エラーのない書き込みのための完全ガイド
    テキスト ファイル内の Unicode テキストを処理する方法: エラーのない書き込みのための完全ガイド
    テキスト ファイル内の Unicode テキスト: エラーのない記述のための包括的なガイドGoogle ドキュメントから抽出されたデータのコーディングは、特に困難な場合があります。 HTML で使用するために変換する必要がある非 ASCII シンボルが見つかった場合。このガイドでは、Unicode ...
    プログラミング 2024 年 11 月 2 日に公開
  • EchoAPI と不眠症: 実践例による包括的な比較
    EchoAPI と不眠症: 実践例による包括的な比較
    フルスタック開発者として、私は API のデバッグ、テスト、文書化のための一流のツールを用意することがいかに重要であるかを知っています。 EchoAPI と Insomnia は 2 つの傑出したオプションであり、それぞれに独自の特徴と機能があります。これらのツールについて説明し、その機能と利点を比...
    プログラミング 2024 年 11 月 2 日に公開
  • 移動時間と所要時間 |プログラミングチュートリアル
    移動時間と所要時間 |プログラミングチュートリアル
    導入 このラボは、Go の時間と期間のサポートについての理解をテストすることを目的としています。 時間 以下のコードには、Go で時間と期間を操作する方法の例が含まれています。ただし、コードの一部が欠落しています。あなたの仕事は、コードを完成させて期待通りに動作させ...
    プログラミング 2024 年 11 月 2 日に公開
  • ホイスティングにおける面接の質問と回答
    ホイスティングにおける面接の質問と回答
    1. JavaScript におけるホイスティングとは何ですか? 答え: ホイスティングは、変数や関数にメモリが割り当てられる実行コンテキストの作成フェーズ中のプロセスです。このプロセス中に、変数用のメモリが割り当てられ、変数には未定義の値が割り当てられます。関数の場合、関数定義全...
    プログラミング 2024 年 11 月 2 日に公開
  • JavaScript のドキュメント オブジェクト モデル (DOM) を理解する
    JavaScript のドキュメント オブジェクト モデル (DOM) を理解する
    こんにちは、素晴らしい JavaScript 開発者の皆さん? ブラウザは、スクリプト (特に JavaScript) が Web ページのレイアウトと対話できるようにするドキュメント オブジェクト モデル (DOM) と呼ばれるプログラミング インターフェイスを提供します。 We...
    プログラミング 2024 年 11 月 2 日に公開
  • SPRING BATCH でプログラミングを始める
    SPRING BATCH でプログラミングを始める
    Introduction Dans vos projets personnels ou professionnels, Il vous arrive de faire des traitements sur de gros volumes de données. Le traite...
    プログラミング 2024 年 11 月 2 日に公開
  • CSS で Github プロフィールを目立たせる
    CSS で Github プロフィールを目立たせる
    これまで、Github プロフィールをカスタマイズできる唯一の方法は、写真を更新するか名前を変更することでした。これは、すべての Github プロファイルが同じに見え、カスタマイズしたり目立たせるためのオプションが最小限であることを意味しました。 それ以来、Markdown を使用してカスタム セ...
    プログラミング 2024 年 11 月 2 日に公開
  • TypeScript ユーティリティの種類: コードの再利用性の向上
    TypeScript ユーティリティの種類: コードの再利用性の向上
    TypeScript は、開発者が型を効果的に変換および再利用できるようにする組み込みのユーティリティ型を提供し、コードをより柔軟で ​​DRY にします。この記事では、TypeScript スキルを次のレベルに引き上げるのに役立つ、Partial、Pick、Omit、Record などの主要なユー...
    プログラミング 2024 年 11 月 2 日に公開
  • 電報 window.open(url, &#_blank&#); iOSでは動作がおかしい
    電報 window.open(url, &#_blank&#); iOSでは動作がおかしい
    電報ボットを作成していて、ミニアプリからチャットに情報を転送するオプションを追加したいと考えています。 window.open(url, '_blank'); を使用することにしました。 iPhone で試してみるまでは問題なく動作していました。転送の代わりに、Share を取得しま...
    プログラミング 2024 年 11 月 2 日に公開
  • フロントエンド開発者とは誰ですか?
    フロントエンド開発者とは誰ですか?
    今日のインターネット上のすべての Web サイトやプラットフォームのユーザー インターフェイス部分は、フロントエンド開発者の仕事の成果です。彼らはユーザーフレンドリーなインターフェイスの作成に携わり、サイトの外観と機能を保証します。しかし、フロントエンド開発者とはいったい誰なのでしょうか?簡単に説明...
    プログラミング 2024 年 11 月 2 日に公開
  • CSS スタイルを保持したまま HTML コンテンツを PDF として保存するにはどうすればよいですか?
    CSS スタイルを保持したまま HTML コンテンツを PDF として保存するにはどうすればよいですか?
    CSS を含む HTML コンテンツを PDF として保存するWeb 開発では、コンテンツを別の形式にエクスポートする場合でも、見た目の美しさを維持することが非常に重要です。変換プロセス中に CSS スタイルが失われる可能性があるため、HTML 要素を PDF として保存しようとするときに問題が発生...
    プログラミング 2024 年 11 月 2 日に公開
  • Print_r() の使用時にファントム プロパティが DateTime オブジェクトに追加されるのはなぜですか?
    Print_r() の使用時にファントム プロパティが DateTime オブジェクトに追加されるのはなぜですか?
    Print_r() DateTime オブジェクトを変更しますPrint_r() は、DateTime オブジェクトにプロパティを追加し、デバッグ中のイントロスペクションを有効にします。この動作は、PHP 5.3 で導入された内部機能の副作用であり、テキストにダンプされたインスタンスにファントム パ...
    プログラミング 2024 年 11 月 2 日に公開
  • C のデータ構造とアルゴリズム: 初心者に優しいアプローチ
    C のデータ構造とアルゴリズム: 初心者に優しいアプローチ
    C では、データ構造とアルゴリズムを使用してデータを整理、保存、操作します。データ構造: 配列: 順序付けされたコレクション、インデックスを使用して要素にアクセスする リンク リスト: ポインターを介して要素をリンク、動的長さをサポート スタック: 先入れ後出し (FILO) 原則キュー: 先入れ先...
    プログラミング 2024 年 11 月 2 日に公開

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3