যে কেউ তাদের কাস্টম সমান্তরাল পান্ডাস-প্রয়োগ কোডটিতে tqdm প্রয়োগ করতে চাইছেন।
(কয়েক বছর ধরে আমি সমান্তরালকরণের জন্য কয়েকটি গ্রন্থাগার চেষ্টা করেছি, তবে মূলত প্রয়োগ কার্যকারিতার জন্য আমি কোনও 100% সমান্তরাল সমাধান খুঁজে পাইনি এবং আমাকে সর্বদা আমার "ম্যানুয়াল" কোডের জন্য ফিরে আসতে হয়েছিল।)
df_m মাল্টি_কোর - এটিই আপনি কল করেন। এটি গ্রহণ করে:
- আপনার ডিএফ অবজেক্ট
- আপনি যে ফাংশনটির নাম কল করতে চান
- কলামগুলির উপসেটটি ফাংশনটি সম্পাদন করা যায় (সময় / স্মৃতি হ্রাস করতে সহায়তা করে)
- সমান্তরালভাবে চালনার কাজের সংখ্যা (-1 বা সমস্ত কোরের জন্য বাদ)
- ডিএফ এর ক্রিয়াকলাপ অন্য কোনও কোয়ার্গাগুলি গ্রহণ করে ("অক্ষ" এর মতো)
_df_split - এটি একটি অভ্যন্তরীণ সহায়ক ফাংশন যা চলমান মডিউলে বিশ্বব্যাপী অবস্থান করতে হবে (পুল.ম্যাপ "প্লেসমেন্ট নির্ভর"), অন্যথায় আমি এটি অভ্যন্তরীণভাবে সনাক্ত করতে পারি ..
আমার সংক্ষেপে কোডটি এখানে (আমি সেখানে আরও পান্ডাস ফাংশন পরীক্ষা যুক্ত করব):
import pandas as pd
import numpy as np
import multiprocessing
from functools import partial
def _df_split(tup_arg, **kwargs):
split_ind, df_split, df_f_name = tup_arg
return (split_ind, getattr(df_split, df_f_name)(**kwargs))
def df_multi_core(df, df_f_name, subset=None, njobs=-1, **kwargs):
if njobs == -1:
njobs = multiprocessing.cpu_count()
pool = multiprocessing.Pool(processes=njobs)
try:
splits = np.array_split(df[subset], njobs)
except ValueError:
splits = np.array_split(df, njobs)
pool_data = [(split_ind, df_split, df_f_name) for split_ind, df_split in enumerate(splits)]
results = pool.map(partial(_df_split, **kwargs), pool_data)
pool.close()
pool.join()
results = sorted(results, key=lambda x:x[0])
results = pd.concat([split[1] for split in results])
return results
বেলো একটি সমান্তরাল প্রয়োগের জন্য একটি পরীক্ষা কোড tqdm "অগ্রগতি_ অ্যাপ্লিকেশন" এর সাথে ।
from time import time
from tqdm import tqdm
tqdm.pandas()
if __name__ == '__main__':
sep = '-' * 50
# tqdm progress_apply test
def apply_f(row):
return row['c1'] + 0.1
N = 1000000
np.random.seed(0)
df = pd.DataFrame({'c1': np.arange(N), 'c2': np.arange(N)})
print('testing pandas apply on {}\n{}'.format(df.shape, sep))
t1 = time()
res = df.progress_apply(apply_f, axis=1)
t2 = time()
print('result random sample\n{}'.format(res.sample(n=3, random_state=0)))
print('time for native implementation {}\n{}'.format(round(t2 - t1, 2), sep))
t3 = time()
# res = df_multi_core(df=df, df_f_name='apply', subset=['c1'], njobs=-1, func=apply_f, axis=1)
res = df_multi_core(df=df, df_f_name='progress_apply', subset=['c1'], njobs=-1, func=apply_f, axis=1)
t4 = time()
print('result random sample\n{}'.format(res.sample(n=3, random_state=0)))
print('time for multi core implementation {}\n{}'.format(round(t4 - t3, 2), sep))
আউটপুটে আপনি সমান্তরালীনতা ছাড়াই চলার জন্য 1 অগ্রগতি বার এবং সমান্তরালে চলার সময় প্রতি-কোর অগ্রগতি বার দেখতে পাবেন। সামান্য হিকআপ রয়েছে এবং কখনও কখনও বাকী সমস্ত কোর একবারে উপস্থিত হয়, তবে তারপরেও আমি মনে করি এটি কার্যকর হয়েছে যেহেতু আপনি প্রতিটি প্রতি অগ্রগতির পরিসংখ্যান পেয়েছেন (এটি / সেকেন্ড এবং মোট রেকর্ড, প্রাক্তন জন্য)
আপনাকে এই মহান লাইব্রেরির জন্য @ abcdaa ধন্যবাদ!