শীর্ষ উত্তরের মধ্যে পারফরম্যান্স উল্লেখযোগ্যভাবে বৈচিত্রময়, এবং জেসি এবং ফামারাল 42 ইতিমধ্যে এটি নিয়ে আলোচনা করেছে, তবে এটি শীর্ষ উত্তরের মধ্যে একটি সুষ্ঠু তুলনা ভাগ করে নেওয়া এবং জেসির উত্তরের একটি সূক্ষ্ম তবে গুরুত্বপূর্ণ বিশদটি বিশদভাবে বর্ণনা করা উচিত: যুক্তিটি এতে প্রবেশ করেছে ফাংশন, কর্মক্ষমতা প্রভাবিত করে ।
(পাইথন 3.7.4, পান্ডাস 1.0.3)
import pandas as pd
import locale
import timeit
def create_new_df_test():
df_test = pd.DataFrame([
{'dir': '/Users/uname1', 'size': 994933},
{'dir': '/Users/uname2', 'size': 109338711},
])
return df_test
def sizes_pass_series_return_series(series):
series['size_kb'] = locale.format_string("%.1f", series['size'] / 1024.0, grouping=True) + ' KB'
series['size_mb'] = locale.format_string("%.1f", series['size'] / 1024.0 ** 2, grouping=True) + ' MB'
series['size_gb'] = locale.format_string("%.1f", series['size'] / 1024.0 ** 3, grouping=True) + ' GB'
return series
def sizes_pass_series_return_tuple(series):
a = locale.format_string("%.1f", series['size'] / 1024.0, grouping=True) + ' KB'
b = locale.format_string("%.1f", series['size'] / 1024.0 ** 2, grouping=True) + ' MB'
c = locale.format_string("%.1f", series['size'] / 1024.0 ** 3, grouping=True) + ' GB'
return a, b, c
def sizes_pass_value_return_tuple(value):
a = locale.format_string("%.1f", value / 1024.0, grouping=True) + ' KB'
b = locale.format_string("%.1f", value / 1024.0 ** 2, grouping=True) + ' MB'
c = locale.format_string("%.1f", value / 1024.0 ** 3, grouping=True) + ' GB'
return a, b, c
ফলাফল এখানে:
9.82 ms ± 377 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
2.34 ms ± 48.6 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
1.36 ms ± 62.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
752 µs ± 18.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
লক্ষ্য করুন কীভাবে টিপলগুলি ফেরানো দ্রুততম পদ্ধতি, তবে যা আর্গুমেন্ট হিসাবে পাস হয় তা কার্য সম্পাদনকেও প্রভাবিত করে। কোডের পার্থক্যটি সূক্ষ্ম তবে কার্যকারিতা উন্নতি তাৎপর্যপূর্ণ।
টেস্ট # 4 (একক মান দিয়ে পাস করা) টেস্ট # 3 (একটি সিরিজে পাস করা) এর দ্বিগুণ দ্রুত, যদিও সঞ্চালিত অপারেশনটি অবশ্যই অভিন্ন।
তবে আরও আছে ...
3.23 ms ± 141 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
2.31 ms ± 39.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
1.36 ms ± 58.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
694 µs ± 3.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
কিছু ক্ষেত্রে (# 1a এবং # 4a), ডেটাফ্রেমে ফাংশন প্রয়োগ করা যেখানে আউটপুট কলামগুলি ইতিমধ্যে বিদ্যমান রয়েছে তা ফাংশন থেকে তৈরি করার চেয়ে দ্রুত।
পরীক্ষা চালানোর কোড এখানে:
print('\nAccepted Answer (pass series, return series, new columns dont exist):')
df_test = create_new_df_test()
%timeit result = df_test.apply(sizes_pass_series_return_series, axis=1)
print('Accepted Answer (pass series, return series, new columns exist):')
df_test = create_new_df_test()
df_test = pd.concat([df_test, pd.DataFrame(columns=['size_kb', 'size_mb', 'size_gb'])])
%timeit result = df_test.apply(sizes_pass_series_return_series, axis=1)
print('\nPandafied (pass series, return tuple, new columns dont exist):')
df_test = create_new_df_test()
%timeit df_test[['size_kb', 'size_mb', 'size_gb']] = df_test.apply(sizes_pass_series_return_tuple, axis=1, result_type="expand")
print('Pandafied (pass series, return tuple, new columns exist):')
df_test = create_new_df_test()
df_test = pd.concat([df_test, pd.DataFrame(columns=['size_kb', 'size_mb', 'size_gb'])])
%timeit df_test[['size_kb', 'size_mb', 'size_gb']] = df_test.apply(sizes_pass_series_return_tuple, axis=1, result_type="expand")
print('\nTuples (pass series, return tuple then zip, new columns dont exist):')
df_test = create_new_df_test()
%timeit df_test['size_kb'], df_test['size_mb'], df_test['size_gb'] = zip(*df_test.apply(sizes_pass_series_return_tuple, axis=1))
print('Tuples (pass series, return tuple then zip, new columns exist):')
df_test = create_new_df_test()
df_test = pd.concat([df_test, pd.DataFrame(columns=['size_kb', 'size_mb', 'size_gb'])])
%timeit df_test['size_kb'], df_test['size_mb'], df_test['size_gb'] = zip(*df_test.apply(sizes_pass_series_return_tuple, axis=1))
print('\nTuples (pass value, return tuple then zip, new columns dont exist):')
df_test = create_new_df_test()
%timeit df_test['size_kb'], df_test['size_mb'], df_test['size_gb'] = zip(*df_test['size'].apply(sizes_pass_value_return_tuple))
print('Tuples (pass value, return tuple then zip, new columns exist):')
df_test = create_new_df_test()
df_test = pd.concat([df_test, pd.DataFrame(columns=['size_kb', 'size_mb', 'size_gb'])])
%timeit df_test['size_kb'], df_test['size_mb'], df_test['size_gb'] = zip(*df_test['size'].apply(sizes_pass_value_return_tuple))