Rumah >pembangunan bahagian belakang >Tutorial Python >FireDucks: Dapatkan prestasi melebihi panda dengan kos pembelajaran sifar!
Panda ialah salah satu perpustakaan yang paling popular, apabila saya mencari cara yang lebih mudah untuk mempercepatkan prestasinya, saya menemui FireDucks dan mula berminat dengannya!
Program Pandas mungkin menghadapi isu prestasi yang serius bergantung pada cara ia ditulis. Walau bagaimanapun, sebagai seorang saintis data, saya mahu menghabiskan lebih banyak masa menganalisis data daripada meningkatkan prestasi kod saya. Jadi, adalah bagus jika ia boleh melakukan sesuatu seperti menukar susunan proses dan mempercepatkan prestasi program secara automatik. Sebagai contoh, Proses A =>Proses B akan menjadi lebih perlahan, jadi kami akan menggantikannya sebagai Proses B =>Proses A. (Sudah tentu, hasilnya dijamin sama.) Dikatakan bahawa saintis data membelanjakan kira-kira 45% masa mereka menyediakan data dan apabila saya berfikir untuk melakukan sesuatu untuk mempercepatkan proses, saya terjumpa modul yang dipanggil FireDucks.
Daripada dokumentasi FireDucks, ia nampaknya disokong untuk platform Linux sahaja. Memandangkan saya menggunakan Windows pada mesin utama saya, saya ingin mencubanya daripada WSL2 (Windows Subsystem for Linux), persekitaran yang boleh menjalankan Linux pada Windows.
Persekitaran yang saya cuba adalah seperti berikut.
WSL telah dipasang dengan bantuan dokumentasi Microsoft berikut; pengedaran Linux ialah Ubuntu 22.04.1 LTS.
Kemudian sebenarnya pasang FireDucks. Ia sangat mudah untuk dipasang.
pip pasang fireducks
Ia akan mengambil masa beberapa minit untuk memasang FireDucks (bersama-sama dengan pyarrow, panda dan perpustakaan lain).
Saya cuba melaksanakan kod di bawah, kelajuan memuatkan sangat pantas, panda mengambil masa 4 saat dan fireDucks hanya mengambil masa 74.5 ns.
# 1. analysis based on time period and creative duration # convert timestamp to date/time object df['timestamp_converted'] = pd.to_datetime(df['timestamp'], unit='s ') # define time period def get_part_of_day(hour): if 5 <= hour < 12: return 'morning' elif 12 <= hour < 17: return 'afternoon' else: return 'evening' # Add time period in new column df['part_of_day'] = df['timestamp_converted'].apply(lambda x: get_part_of_day(x.hour)) # Calculate average creative duration by time period df_ duration_by_time = df.groupby('part_of_day')['creative_duration'].mean() print(df_duration_by_time) # 2. campaign performance per different advertiser df_ campaigns_per_advertiser = df.groupby('advertiser_id')['campaign_id'].nunique() df_creatives_per_advertiser = df.groupby('advertiser_id ')['creatives_id'].nunique() print(df_campaigns_per_advertiser) print(df_creatives_per_advertiser) # 3. language and website association df_common_website_ per_language = df.groupby('placement_language')['website_id'].apply(lambda x: x.mode()[0]) print(df_common_website_per_language) # 4. Analyze referrer information def extract_domain(referrer): # if referrer is a float (e.g. NaN), return empty string if isinstance(referrer, float): return '' # otherwise, extract domain name return referrer.split('/')[0] df['referrer_domain'] = df['referrer_deep_three'].apply(extract_domain) df_referrer_distribution = df['referrer_domain'].value_counts() print(df_referrer_distribution)
Semua prapemprosesan dan analisis data ini mengambil masa sekitar 8 saat dalam panda, manakala ia boleh diselesaikan dalam masa 4 saat apabila menggunakan FireDucks. Hampir 2 kali ganda kelajuan boleh dicapai.
Salah satu perkara yang paling tertekan tentang menggunakan panda ialah menunggu apabila memuatkan set data yang besar, dan kemudian saya perlu menunggu operasi yang kompleks seperti groupby. Sebaliknya, memandangkan FireDucks melakukan penilaian yang malas, pemuatan itu sendiri tidak mengambil masa sama sekali, jadi pemprosesan dilakukan di tempat yang diperlukan, dan saya merasakan ia sangat penting dengan pengurangan yang hebat dalam jumlah masa menunggu.
Bagi prestasi lain, nampaknya sehingga 16 kali ganda lebih pantas berbanding panda telah dicapai, seperti yang diumumkan secara rasmi oleh organisasi. (Saya akan membandingkan prestasi dengan pelbagai perpustakaan yang bersaing pada masa akan datang.)
Keupayaan untuk mengikuti notasi panda yang tepat tanpa perlu memikirkan apa-apa adalah kelebihan yang besar. Selain FireDucks, terdapat perpustakaan pecutan bingkai data lain, tetapi ia terlalu mahal untuk dipelajari dan terlalu mudah untuk dilupakan.
Sebagai contoh, jika anda ingin menambah lajur dengan kutub, anda perlu menulis sesuatu seperti ini.
# pandas df["new_col"] = df["A"] + 1 # polars df = df.with_columns((pl.col("A") + 1).alias("new_col"))
Saya mempunyai beberapa ETL dan projek lain yang menggunakan panda, dan adalah bagus untuk melihat peningkatan prestasi hanya dengan memasang dan menggantikan pernyataan import dengan FireDucks.
Jika anda ingin menambahkannya lagi, sila komen di bawah.
Atas ialah kandungan terperinci FireDucks: Dapatkan prestasi melebihi panda dengan kos pembelajaran sifar!. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!