Manfaat Prestasi Indeks Diisih
Isih MultiIndex dengan sort_index(), ukur prestasi hirisan dengan timeit dan gunakan is_monotonic_increasing sebagai pengawal.
Manfaat Prestasi Indeks Diisih ialah pelajaran Pandas & NumPy Academy percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Pandas & NumPy Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Pandas & NumPy Academy merangkumi sejumlah 4 pelajaran.
Mengapa Pengisihan Indeks Penting untuk Prestasi
Indeks yang diisih membolehkan Pandas menggunakan carian binari (O(log n)) dan bukannya imbasan linear penuh (O(n)) apabila mencari julat label. Bagi DataFrame dengan sejuta baris, carian binari menemui julat sasaran dalam kira-kira 20 perbandingan berbanding sehingga sejuta perbandingan dengan imbasan linear. Hal ini menjadikan operasi hirisan pada MultiIndexes yang diisih jauh lebih pantas berbanding yang tidak diisih — dan perbezaannya menjadi kritikal dalam saluran pemprosesan pengeluaran yang memproses berjuta-juta baris.
import pandas as pd
import numpy as np
np.random.seed(42)
# Create a large DataFrame with a MultiIndex
countries = ['DE', 'UK', 'USA', 'FR', 'JP']
dates = pd.date_range('2020-01-01', periods=200)
mi = pd.MultiIndex.from_product([countries, dates], names=['country', 'date'])
df = pd.DataFrame({'value': np.random.randn(len(mi))}, index=mi)
print(f'DataFrame shape: {df.shape}')
print(f'Index is sorted: {df.index.is_monotonic_increasing}')Menyemak Sama Ada Indeks Telah Diisih
Gunakan df.index.is_monotonic_increasing untuk menyemak sama ada indeks diisih dalam tertib menaik. Ini mengembalikan nilai boolean. Untuk MultiIndex, Pandas menyemak pengisihan secara leksikografi merentas semua aras. Sentiasa lakukan semakan ini sebelum menjalankan operasi hirisan dengan .loc[start:end] pada MultiIndex — indeks yang tidak diisih akan sama ada mencetuskan UnsortedIndexError atau mengembalikan hasil yang salah secara senyap, bergantung pada versi Pandas.
import pandas as pd
# Sorted MultiIndex
tuples_sorted = [('A', 1), ('A', 2), ('B', 1), ('B', 2)]
mi_sorted = pd.MultiIndex.from_tuples(tuples_sorted)
df_sorted = pd.DataFrame({'v': [10, 20, 30, 40]}, index=mi_sorted)
# Unsorted MultiIndex
tuples_unsorted = [('B', 2), ('A', 1), ('B', 1), ('A', 2)]
mi_unsorted = pd.MultiIndex.from_tuples(tuples_unsorted)
df_unsorted = pd.DataFrame({'v': [10, 20, 30, 40]}, index=mi_unsorted)
print('Sorted index is_monotonic_increasing:', df_sorted.index.is_monotonic_increasing)
print('Unsorted index is_monotonic_increasing:', df_unsorted.index.is_monotonic_increasing)Mengisih dengan sort_index()
df.sort_index() mengembalikan DataFrame baharu dengan baris yang diisih mengikut label indeks dalam tertib menaik. Gunakan ascending=False untuk tertib menurun. Bagi MultiIndex, pengisihan adalah secara leksikografi: aras paling luar diisih dahulu, kemudian aras dalaman dalam setiap kumpulan luar. Sentiasa lakukan pengisihan selepas sebarang operasi yang mungkin mengganggu tertib indeks — seperti pd.concat, penapisan atau penambahan baris baharu.
import pandas as pd
import numpy as np
np.random.seed(0)
countries = ['USA', 'UK', 'DE']
years = [2021, 2022, 2023]
mi = pd.MultiIndex.from_product([countries, years], names=['country', 'year'])
df = pd.DataFrame({'gdp': np.random.randint(3000, 26000, 9)}, index=mi)
print('Before sort_index():')
print(df.head(4))
df_sorted = df.sort_index()
print('\nAfter sort_index():')
print(df_sorted.head(4))
print('Is sorted:', df_sorted.index.is_monotonic_increasing)Mengukur Masa Carian dengan timeit
Modul timeit Python mengukur tempoh yang diperlukan oleh suatu pernyataan untuk dilaksanakan dengan menjalankannya berkali-kali dan mengambil purata. Gunakannya untuk menanda aras carian indeks yang diisih berbanding yang tidak diisih. Dalam IPython/Jupyter, magik %timeit menyediakan fungsi yang sama dengan output yang lebih kemas. Penandaarasan ialah satu-satunya cara yang boleh dipercayai untuk mengesahkan bahawa pengoptimuman prestasi benar-benar membantu — jangan sekali-kali menganggap sesuatu perubahan lebih pantas tanpa mengukurnya.
import pandas as pd
import numpy as np
import timeit
np.random.seed(0)
N = 500000
idx = np.random.choice(['A','B','C','D','E'], N)
df_unsorted = pd.DataFrame({'v': np.random.randn(N)}, index=idx)
df_sorted = df_unsorted.sort_index()
# Time label lookup: sorted vs unsorted
t_unsorted = timeit.timeit(lambda: df_unsorted.loc['C'], number=100)
t_sorted = timeit.timeit(lambda: df_sorted.loc['C'], number=100)
print(f'Unsorted lookup (100 runs): {t_unsorted:.3f}s')
print(f'Sorted lookup (100 runs): {t_sorted:.3f}s')
print(f'Speedup: {t_unsorted/t_sorted:.1f}x')PerformanceWarning daripada MultiIndex yang Tidak Diisih
Pandas mengeluarkan PerformanceWarning apabila anda menghiris MultiIndex yang tidak diisih secara leksikografi: 'indexing past lexsort depth may impact performance'. Amaran ini bermaksud Pandas terpaksa menggunakan imbasan linear dan bukannya carian binari. Walaupun ia masih mengembalikan hasil yang betul dalam kes mudah, ia boleh mengembalikan hasil yang salah apabila menghiris aras dalaman indeks berbilang aras yang tidak diisih. Anggap amaran ini sebagai ralat dan betulkan punca masalah dengan mengisih indeks.
import pandas as pd
import warnings
# Create an unsorted MultiIndex and trigger the warning
tuples = [('B', 2), ('A', 1), ('B', 1), ('A', 2)]
mi = pd.MultiIndex.from_tuples(tuples, names=['letter', 'num'])
df = pd.DataFrame({'v': [10, 20, 30, 40]}, index=mi)
print('Index sorted?', df.index.is_monotonic_increasing)
# This may trigger PerformanceWarning in some Pandas versions
with warnings.catch_warnings(record=True) as w:
warnings.simplefilter('always')
try:
result = df.loc['A':'B', :]
print('Result:', result)
if w:
print('Warning:', str(w[0].message))
except Exception as e:
print('Error (common with newer Pandas):', type(e).__name__)Menanda Aras Penghirisan MultiIndex yang Diisih berbanding yang Tidak Diisih
Penghirisan MultiIndex yang diisih jauh lebih pantas kerana Pandas boleh melakukan carian binari pada tatasusunan aras luar dan aras dalam. Mari kita menanda aras penghirisan MultiIndex besar dengan sejuta baris — saiz yang lazim dalam saluran analitis pengeluaran. Versi yang diisih mengelakkan imbasan linear dan secara konsisten menunjukkan peningkatan kelajuan 5-50 kali ganda, bergantung pada kepilihan hirisan.
import pandas as pd
import numpy as np
import timeit
np.random.seed(42)
countries = ['DE', 'UK', 'USA', 'FR', 'JP']
dates = pd.date_range('2010-01-01', periods=200000)
# Sample a random subset for timing test
sample_countries = np.random.choice(countries, 100000)
sample_dates = np.random.choice(dates, 100000)
df = pd.DataFrame({
'country': sample_countries,
'date': sample_dates,
'value': np.random.randn(100000)
}).set_index(['country', 'date'])
df_sorted = df.sort_index()
print('Dataset size:', len(df))
print('Sorted:', df_sorted.index.is_monotonic_increasing)
t = timeit.timeit(lambda: df_sorted.loc['USA'], number=50)
print(f'Sorted lookup (50 runs): {t:.3f}s')sort_index dengan Parameter level
Untuk MultiIndex, anda boleh mengisih mengikut aras tertentu dan bukannya semua aras menggunakan parameter level: df.sort_index(level='year'). Ini berguna apabila anda mahu mengekalkan pengumpulan aras luar tetapi menyusun semula baris dalam setiap kumpulan luar. Argumen sort_remaining=True (lalai) turut mengisih mana-mana aras yang belum diisih selepas aras yang dinyatakan, bagi memastikan tertib leksikografi penuh.
import pandas as pd
import numpy as np
countries = ['USA', 'UK']
years = [2023, 2021, 2022] # deliberately unordered
mi = pd.MultiIndex.from_product([countries, years], names=['country', 'year'])
df = pd.DataFrame({'v': range(6)}, index=mi)
print('Before sorting by year level:')
print(df)
# Sort by the inner level (year) only
df_ysorted = df.sort_index(level='year')
print('\nAfter sort_index(level="year"):')
print(df_ysorted)is_monotonic_increasing sebagai Pengawal Saluran Pemprosesan
Dalam saluran pemprosesan pengeluaran, tambahkan pengawal pengisihan pada permulaan mana-mana fungsi yang menerima DataFrame dengan MultiIndex dan melakukan penghirisan. Jika indeks tidak diisih, isihkannya secara automatik dan catatkan amaran. Ini menghalang kemerosotan prestasi secara senyap atau hasil yang salah apabila kod huluan mengubah tertib DataFrame. Pengawal pada sempadan fungsi lebih boleh dipercayai daripada menganggap pemanggil sentiasa menghantar data yang telah diisih.
import pandas as pd
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
def safe_slice(df, key):
'''Slice a MultiIndex DataFrame, sorting if necessary.'''
if not df.index.is_monotonic_increasing:
logger.warning('Index not sorted — sorting now. This is a performance cost.')
df = df.sort_index()
return df.loc[key]
# Test with an unsorted DataFrame
tuples = [('B', 2), ('A', 1), ('B', 1), ('A', 2)]
mi = pd.MultiIndex.from_tuples(tuples, names=['letter', 'num'])
df = pd.DataFrame({'v': [10, 20, 30, 40]}, index=mi)
result = safe_slice(df, 'A')
print('Slice result for A:')
print(result)Indeks Diisih untuk Carian Binari pada Indeks Ringkas
Manfaat prestasi pengisihan turut terpakai pada indeks biasa (bukan berbilang). DatetimeIndex yang digunakan dalam analisis siri masa melakukan penghirisan julat tarikh dengan jauh lebih pantas apabila diisih. Indeks rentetan yang diisih mengikut abjad membolehkan carian binari untuk carian label. Bagi Series besar harga saham yang diindeks mengikut cap masa, pengisihan DatetimeIndex boleh mengubah operasi hirisan selama 100ms menjadi operasi kurang daripada satu milisaat.
import pandas as pd
import numpy as np
import timeit
np.random.seed(0)
# Random timestamps — unsorted
timestamps = pd.date_range('2020-01-01', periods=500000, freq='min')
shuffled = np.random.permutation(timestamps)
prices = pd.Series(np.random.randn(500000), index=shuffled)
prices_sorted = prices.sort_index()
# Time a date range slice
t_unsorted = timeit.timeit(lambda: prices['2020-06-01':'2020-06-30'], number=20)
t_sorted = timeit.timeit(lambda: prices_sorted['2020-06-01':'2020-06-30'], number=20)
print(f'Unsorted: {t_unsorted:.3f}s')
print(f'Sorted: {t_sorted:.3f}s')
print(f'Speedup: {t_unsorted/t_sorted:.0f}x')Kos Memori Pengisihan
Pengisihan bukan percuma — sort_index() mencipta salinan baharu DataFrame (kecuali apabila menggunakan inplace=True, yang mengubahnya di tempat). Bagi DataFrame yang sangat besar, penggunaan memori puncak meningkat dua kali ganda buat sementara waktu. Strategi yang praktikal ialah mengisih sekali ketika pemuatan dan mengekalkan versi yang telah diisih sepanjang saluran pemprosesan, bukannya mengisih berulang kali. Jika memori terhad, isih di tempat dengan df.sort_index(inplace=True) untuk mengelakkan salinan sementara.
import pandas as pd
import numpy as np
np.random.seed(0)
countries = ['DE', 'UK', 'USA']
years = [2021, 2022, 2023]
mi = pd.MultiIndex.from_product([countries, years], names=['country', 'year'])
df = pd.DataFrame({'v': np.random.randn(9)}, index=mi)
# Sort once at load time — best practice
df.sort_index(inplace=True) # no temporary copy
assert df.index.is_monotonic_increasing, 'Index must be sorted!'
print('Pipeline-ready DataFrame (sorted in place):')
print(df)Ringkasan Amalan Terbaik Indeks yang Diisih
Peraturan utama untuk prestasi indeks: 1) Sentiasa panggil sort_index() selepas sebarang operasi yang mungkin mengganggu tertib indeks (concat, merge, append, filter). 2) Gunakan is_monotonic_increasing sebagai pengawal dalam fungsi yang menghiris indeks. 3) Isih ketika pemuatan dan kekalkan DataFrame yang telah diisih sepanjang saluran pemprosesan untuk mengelakkan pengisihan berulang. 4) Bagi DataFrame MultiIndex, pastikan semua aras diisih, bukan hanya aras paling luar. 5) Gunakan timeit untuk mengesahkan bahawa pengisihan benar-benar memberikan peningkatan kelajuan yang dijangkakan dalam saluran pemprosesan khusus anda.
Semakan Pantas
Uji pemahaman anda tentang prestasi indeks yang diisih daripada pelajaran ini.
Rumusan Pelajaran
Dalam pelajaran ini anda telah mempelajari bahawa is_monotonic_increasing menyemak sama ada indeks telah diisih dan carian binari tersedia, sort_index() mengisih di tempat atau mengembalikan salinan yang telah diisih, dan timeit mengukur peningkatan kelajuan sebenar untuk mengesahkan manfaatnya. Seterusnya, kita akan meneroka fungsi tetingkap — statistik rolling dan berkembang untuk siri masa serta data kewangan.
Pelajari Python dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 30
- Pelajaran
- 120
Soalan Lazim
Adakah pelajaran “Manfaat Prestasi Indeks Diisih” percuma?
Ya — teks penuh “Manfaat Prestasi Indeks Diisih” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Pandas & NumPy Academy, tingkat taraf kepada CoddyKit PRO. Kursus Pandas & NumPy Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Manfaat Prestasi Indeks Diisih”?
Isih MultiIndex dengan sort_index(), ukur prestasi hirisan dengan timeit dan gunakan is_monotonic_increasing sebagai pengawal. Anda berlatih Pandas & NumPy Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Pandas & NumPy Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Pandas & NumPy Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.
Berapa lamakah pelajaran “Manfaat Prestasi Indeks Diisih” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Pandas & NumPy Academy ini?
Ya. Setiap pelajaran Pandas & NumPy Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Mencipta MultiIndex
- Memilih Data daripada MultiIndex
- Penyelarasan Indeks dan Pengindeksan Semula
- Manfaat Prestasi Indeks Diisih