検索
ホームページバックエンド開発Python チュートリアルPython メモリ最適化をマスターする: データ サイエンスと機械学習のテクニック

Mastering Python Memory Optimization: Techniques for Data Science and Machine Learning

多作な作家として、私の Amazon の書籍コレクションをぜひご覧ください。 忘れずに Medium で私をフォローして最新情報を入手し、サポートを示してください。ご激励をよろしくお願いいたします!

データ サイエンスと機械学習における Python の重要性が高まっているため、大規模プロジェクトでは効率的なメモリ管理が必要です。 データセットのサイズが拡大し、計算需要が増大しているため、メモリ使用量の最適化が重要になっています。 メモリ集約型の Python アプリケーションに関する私の経験から、いくつかの効果的な最適化戦略が生まれました。それをここで共有します。

数値計算の基礎となるライブラリである NumPy から始めます。 NumPy 配列は、特に大規模なデータセットの場合、Python リストに比べてメモリ上の大幅な利点を提供します。 連続したメモリ割り当てと静的型付けにより、オーバーヘッドが最小限に抑えられます。

次の比較を考えてみましょう:

import numpy as np
import sys

# Creating a list and a NumPy array with 1 million integers
py_list = list(range(1000000))
np_array = np.arange(1000000)

# Comparing memory usage
print(f"Python list size: {sys.getsizeof(py_list) / 1e6:.2f} MB")
print(f"NumPy array size: {np_array.nbytes / 1e6:.2f} MB")

NumPy 配列のメモリ使用量が小さいことは明らかです。 この差異は、データセットが大きくなるほど顕著になります。

NumPy はメモリ効率の高い操作も提供します。 操作ごとに新しい配列を生成する代わりに、多くの場合、配列をインプレースで変更します。

# In-place operations
np_array += 1  # Modifies the original array directly

Pandas に目を向けると、カテゴリカル データ型がメモリ最適化の鍵となります。 一意の値が制限されている文字列列の場合、カテゴリ型に変換するとメモリ消費量が大幅に削減されます。

import pandas as pd

# DataFrame with repeated string values
df = pd.DataFrame({'category': ['A', 'B', 'C'] * 1000000})

# Memory usage check
print(f"Original memory usage: {df.memory_usage(deep=True).sum() / 1e6:.2f} MB")

# Conversion to categorical
df['category'] = pd.Categorical(df['category'])

# Post-conversion memory usage
print(f"Memory usage after conversion: {df.memory_usage(deep=True).sum() / 1e6:.2f} MB")

特に繰り返しの文字列を含む大規模なデータセットの場合、メモリを大幅に節約できます。

スパース データセットの場合、Pandas はスパース データ構造を提供し、null 以外の値のみを保存するため、多数の null またはゼロ値を持つデータセットのメモリを大幅に節約できます。

# Creating a sparse series
sparse_series = pd.Series([0, 0, 1, 0, 2, 0, 0, 3], dtype="Sparse[int]")

print(f"Memory usage: {sparse_series.memory_usage(deep=True) / 1e3:.2f} KB")

データセットが利用可能な RAM を超えると、メモリ マップされたファイルは変化します。 ファイル全体をロードせずに、メモリ内にあるかのように大きなファイルを操作できるようになります。

import mmap
import os

# Creating a large file
with open('large_file.bin', 'wb') as f:
    f.write(b'0' * 1000000000)  # 1 GB file

# Memory-mapping the file
with open('large_file.bin', 'r+b') as f:
    mmapped_file = mmap.mmap(f.fileno(), 0)

# Reading from the memory-mapped file
print(mmapped_file[1000000:1000010])

# Cleaning up
mmapped_file.close()
os.remove('large_file.bin')

これは、大きなファイルをメモリに完全にロードせずにランダムにアクセスする場合に特に便利です。

ジェネレーター式と itertools は、メモリ効率の高いデータ処理に強力です。すべてを同時にメモリにロードすることなく、大規模なデータセットを処理できます:

import itertools

# Generator expression
sum_squares = sum(x*x for x in range(1000000))

# Using itertools for memory-efficient operations
evens = itertools.islice(itertools.count(0, 2), 1000000)
sum_evens = sum(evens)

print(f"Sum of squares: {sum_squares}")
print(f"Sum of even numbers: {sum_evens}")

これらの手法により、大規模なデータセットを処理する際のメモリ オーバーヘッドが最小限に抑えられます。

パフォーマンスが重要なコード セクションに対して、Cython は大幅な最適化の可能性を提供します。 Python コードを C にコンパイルすると、速度が大幅に向上し、メモリが削減される可能性があります:

def sum_squares_cython(int n):
    cdef int i
    cdef long long result = 0
    for i in range(n):
        result += i * i
    return result

# Usage
result = sum_squares_cython(1000000)
print(f"Sum of squares: {result}")

この Cython 関数は、特に n 値が大きい場合、純粋な Python 関数よりも優れたパフォーマンスを発揮します。

ジャストインタイム コンパイラである PyPy は、自動メモリ最適化を提供します。 これは、長時間実行されるプログラムに特に有益であり、多くの場合、メモリ使用量が大幅に削減されます:

import numpy as np
import sys

# Creating a list and a NumPy array with 1 million integers
py_list = list(range(1000000))
np_array = np.arange(1000000)

# Comparing memory usage
print(f"Python list size: {sys.getsizeof(py_list) / 1e6:.2f} MB")
print(f"NumPy array size: {np_array.nbytes / 1e6:.2f} MB")

PyPy は、標準の CPython と比較してメモリ効率と速度の向上につながります。

メモリ プロファイリングは、最適化の機会を特定するために不可欠です。 memory_profiler ライブラリは貴重なツールです:

# In-place operations
np_array += 1  # Modifies the original array directly

メモリ使用量を視覚化するには、mprof run script.pymprof plot を使用します。

メモリ リークに対処することは非常に重要です。 tracemalloc モジュール (Python 3.4 ) は、メモリ割り当てソースの識別に役立ちます:

import pandas as pd

# DataFrame with repeated string values
df = pd.DataFrame({'category': ['A', 'B', 'C'] * 1000000})

# Memory usage check
print(f"Original memory usage: {df.memory_usage(deep=True).sum() / 1e6:.2f} MB")

# Conversion to categorical
df['category'] = pd.Categorical(df['category'])

# Post-conversion memory usage
print(f"Memory usage after conversion: {df.memory_usage(deep=True).sum() / 1e6:.2f} MB")

これにより、メモリを大量に使用するコード セクションが特定されます。

非常にメモリを大量に消費するアプリケーションの場合、カスタム メモリ管理が必要になる場合があります。 これには、オブジェクトの再利用またはカスタム キャッシュのためのオブジェクト プールが関係する可能性があります:

# Creating a sparse series
sparse_series = pd.Series([0, 0, 1, 0, 2, 0, 0, 3], dtype="Sparse[int]")

print(f"Memory usage: {sparse_series.memory_usage(deep=True) / 1e3:.2f} KB")

これにより、オブジェクトの作成/破棄のオーバーヘッドが最小限に抑えられます。

非常に大規模なデータセットの場合は、Dask のようなアウトオブコア計算ライブラリを検討してください。

import mmap
import os

# Creating a large file
with open('large_file.bin', 'wb') as f:
    f.write(b'0' * 1000000000)  # 1 GB file

# Memory-mapping the file
with open('large_file.bin', 'r+b') as f:
    mmapped_file = mmap.mmap(f.fileno(), 0)

# Reading from the memory-mapped file
print(mmapped_file[1000000:1000010])

# Cleaning up
mmapped_file.close()
os.remove('large_file.bin')

Dask は、計算を小さなチャンクに分割することで、利用可能な RAM よりも大きなデータセットを処理します。

アルゴリズムの最適化も重要です。 効率的なアルゴリズムを選択すると、メモリ使用量を大幅に削減できます:

import itertools

# Generator expression
sum_squares = sum(x*x for x in range(1000000))

# Using itertools for memory-efficient operations
evens = itertools.islice(itertools.count(0, 2), 1000000)
sum_evens = sum(evens)

print(f"Sum of squares: {sum_squares}")
print(f"Sum of even numbers: {sum_evens}")

この最適化されたフィボナッチ関数は、単純な再帰実装とは異なり、定数メモリを使用します。

要約すると、効果的な Python メモリ最適化は、効率的なデータ構造、特殊なライブラリ、メモリ効率の高いコーディング、および適切なアルゴリズムを組み合わせたものです。 これらの手法によりメモリ フットプリントが削減され、より大きなデータセットやより複雑な計算の処理が可能になります。 コードのプロファイリングを忘れずに行ってボトルネックを特定し、最も大きな影響を与える最適化の取り組みに焦点を当ててください。


101 冊

著者

Aarav Joshi が共同設立した AI を活用した出版社 101 Books は、AI を活用して出版コストを最小限に抑え、質の高い知識にアクセスできるようにしています (一部の書籍は、 4 ドル!).

Amazon で Golang Clean Code の本を見つけてください。

アップデートやその他のタイトルについては、Amazon で Aarav Joshi を検索してください。 特別割引は [リンク] からご利用いただけます。

私たちの作品

私たちの作品をご覧ください:

インベスターセントラル | 投資家中央スペイン人 | 中央ドイツの投資家 | スマートな暮らし | エポックとエコー | 不可解な謎 | ヒンドゥーヴァ | エリート開発者 | JS スクール


私たちは中程度です

Tech Koala Insights | エポックズ&エコーズワールド | インベスター・セントラル・メディア | 不可解な謎 中 | 科学とエポックミディアム | 現代ヒンドゥーヴァ

以上がPython メモリ最適化をマスターする: データ サイエンスと機械学習のテクニックの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
リストと配列の選択は、大規模なデータセットを扱うPythonアプリケーションの全体的なパフォーマンスにどのように影響しますか?リストと配列の選択は、大規模なデータセットを扱うPythonアプリケーションの全体的なパフォーマンスにどのように影響しますか?May 03, 2025 am 12:11 AM

forhandlinglaredataSetsinpython、usenumpyArrays forbetterperformance.1)numpyarraysarememory-effictientandfasterfornumericaloperations.2)nusinnnnedarytypeconversions.3)レバレッジベクトル化は、測定済みのマネージメーシェイメージーウェイズデイタイです

Pythonのリストと配列にメモリがどのように割り当てられるかを説明します。Pythonのリストと配列にメモリがどのように割り当てられるかを説明します。May 03, 2025 am 12:10 AM

inpython、listsusedynamicmemoryallocation with allocation、whilenumpyArraysalocatefixedmemory.1)listsallocatemorememorythanneededededinitivative.2)numpyArrayasallocateexactmemoryforements、rededicablebutlessflexibilityを提供します。

Pythonアレイ内の要素のデータ型をどのように指定しますか?Pythonアレイ内の要素のデータ型をどのように指定しますか?May 03, 2025 am 12:06 AM

inpython、youcanspecthedatatypeyfelemeremodelernspant.1)usenpynernrump.1)usenpynerp.dloatp.ploatm64、フォーマーpreciscontrolatatypes。

Numpyとは何ですか、そしてなぜPythonの数値コンピューティングにとって重要なのですか?Numpyとは何ですか、そしてなぜPythonの数値コンピューティングにとって重要なのですか?May 03, 2025 am 12:03 AM

numpyisessentialfornumericalcomputinginpythonduetoitsspeed、memory efficiency、andcomprehensivematicalfunctions.1)それは、performsoperations.2)numpyArraysaremoremory-efficientthanpythonlists.3)Itofderangeofmathematicaloperty

「隣接するメモリ割り当て」の概念と、配列にとってその重要性について説明します。「隣接するメモリ割り当て」の概念と、配列にとってその重要性について説明します。May 03, 2025 am 12:01 AM

contiguousMemoryAllocationisucial forArraysは、ForeffienceAndfastelementAccess.1)iteenablesConstantTimeAccess、O(1)、DuetodirectAddresscalculation.2)itemprovesefficiencyByAllowingMultiblementFechesperCacheLine.3)itimplifieMememm

Pythonリストをどのようにスライスしますか?Pythonリストをどのようにスライスしますか?May 02, 2025 am 12:14 AM

slicingapythonlistisdoneusingtheyntaxlist [start:stop:step] .hore'showitworks:1)startisthe indexofthefirstelementtoinclude.2)spotisthe indexofthefirmenttoeexclude.3)staptistheincrementbetbetinelements

Numpyアレイで実行できる一般的な操作は何ですか?Numpyアレイで実行できる一般的な操作は何ですか?May 02, 2025 am 12:09 AM

numpyallows forvariousoperationsonarrays:1)basicarithmeticlikeaddition、減算、乗算、および分割; 2)AdvancedperationssuchasmatrixMultiplication;

Pythonを使用したデータ分析では、配列はどのように使用されていますか?Pythonを使用したデータ分析では、配列はどのように使用されていますか?May 02, 2025 am 12:09 AM

Arraysinpython、特にnumpyandpandas、aresentialfordataanalysis、offeringspeedandeficiency.1)numpyarraysenable numpyarraysenable handling forlaredatasents andcomplexoperationslikemoverages.2)Pandasextendsnumpy'scapabivitieswithdataframesfortruc

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

SublimeText3 Mac版

SublimeText3 Mac版

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

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール