PYTHONPERFORMANCEBENCHMARKSUITE(1) Python Performance Benchmark Suite PYTHONPERFORMANCEBENCHMARKSUITE(1)

pythonperformancebenchmarksuite - مستندات مجموعه بنچمارک عملکرد پایتون

پروژهٔ pyperformance با این هدف طراحی شده است که مرجعی معتبر برای سنجش عملکرد (بنچمارک) تمامی پیاده‌سازی‌های Python باشد. تمرکز اصلی آن بر بنچمارک‌های دنیای واقعی به‌جای بنچمارک‌های ساختگی (synthetic) است و در صورت امکان از برنامه‌های کامل استفاده می‌کند.

نرم‌افزار pyperformance تحت مجوز MIT توزیع می‌شود.

مستندات:

دستور نصب pyperformance:

python3 -m pip install pyperformance

این دستور برنامهٔ جدید pyperformance را نصب می‌کند.

در صورت نیاز، وابستگی‌های pyperf و six به‌طور خودکار نصب می‌شوند.

نرم‌افزار pyperformance بر روی Python 3.6 و نسخه‌های جدیدتر اجرا می‌شود، اما ممکن است بر روی Python 3.4 و 3.5 نیز کار کند.

در زمان اجرا، ممکن است فایل‌های توسعهٔ Python (فایل‌های هدر) برای نصب برخی وابستگی‌ها مانند dulwich_log یا psutil به‌منظور کامپایل افزونه‌های C آن‌ها نیاز باشد. دستورهای نصب این وابستگی‌ها در Fedora:

  • پایتون ۳: sudo dnf install python3-devel
  • PyPy: sudo dnf install pypy-devel

    در Windows، برای اینکه pyperformance بتواند وابستگی‌هایی مانند greenlet، dulwich یا psutil را از سورس بسازد، چنانچه می‌خواهید از یک python.exe کامپایل‌شده از سورس استفاده کنید، نباید مستقیماً از آن python.exe استفاده نمایید. در عوض، باید دستور کم‌تر شناخته‌شده‌ی PC\layout را اجرا کنید تا ساختاری در سیستم‌فایل ایجاد شود که شبیه به یک Python نصب‌شده باشد:

.\python.bat -m PC.layout --preset-default --copy installed -v

(برای اطلاعات بیشتر در مورد PC\layout، از گزینه‌ی --help استفاده کنید.)

اکنون می‌توانید از فایل اجرایی Python "نصب‌شده" استفاده کنید:

installed\python.exe -m pip install pyperformance
installed\python.exe -m pyperformance run ...

استفاده از یک فایل اجرایی Python که واقعاً نصب شده باشد (مثلاً از طریق py) نیز به خوبی کار می‌کند.

دستورهایی برای مقایسه‌ی کارایی Python 3.6 و Python 3.7:

pyperformance run --python=python3.6 -o py36.json
pyperformance run --python=python3.7 -o py37.json
pyperformance compare py36.json py37.json

نکته: ساختار python3 -m pyperformance ... نیز کار می‌کند (مثال: python3 -m pyperformance run -o py37.json)، اما مستلزم نصب pyperformance روی هر یک از نسخه‌های آزمایش‌شده‌ی Python است.

فایل‌های JSON توسط ماژول pyperf تولید می‌شوند و بنابراین می‌توان آن‌ها را با استفاده از دستورهای pyperf تحلیل کرد:

python3 -m pyperf show py36.json
python3 -m pyperf check py36.json
python3 -m pyperf metadata py36.json
python3 -m pyperf stats py36.json
python3 -m pyperf hist py36.json
python3 -m pyperf dump py36.json
(...)

همچنین امکان استفاده از pyperf برای مقایسه‌ی نتایج دو فایل JSON وجود دارد:

python3 -m pyperf compare_to py36.json py37.json --table

عملیات‌های pyperformance:

run                 اجرای بنچمارک‌ها روی پایتون در حال اجرا
show                نمایش یک فایل بنچمارک
compare             مقایسه دو فایل بنچمارک
list                فهرست کردن بنچمارک‌های پایتون در حال اجرا
list_groups         فهرست کردن گروه‌های بنچمارک پایتون در حال اجرا
venv                عملیات روی محیط مجازی

گزینه‌های موجود برای همهٔ دستورها:

-h, --help            نمایش این پیام راهنما و خروج

اجرای بنچمارک‌ها روی python در حال اجرا.

کاربرد:

pyperformance run [-h] [-r] [-f] [--debug-single-value] [-v] [-m]
                     [--affinity CPU_LIST] [-o FILENAME]
                     [--append FILENAME] [--manifest MANIFEST]
                     [--timeout TIMEOUT] [-b BM_LIST]
                     [--inherit-environ VAR_LIST] [-p PYTHON]
                     [--hook HOOK]

گزینه‌ها:

-h, --help            نمایش این پیام راهنما و خروج
-r, --rigorous        صرف زمان بیشتر برای اجرای آزمون‌ها جهت دریافت
                      نتایج دقیق‌تر
-f, --fast            دریافت سریع نتایج تقریبی
--debug-single-value  اشکال‌زدایی: سریع‌ترین حالت، تنها محاسبه یک
                      مقدار واحد
-v, --verbose         چاپ خروجی بیشتر
-m, --track-memory    ردیابی مصرف حافظه. این قابلیت فقط در Linux
                      کار می‌کند.
--affinity CPU_LIST   تعیین CPU affinity برای اجراهای بنچمارک. به
                      این ترتیب، می‌توان بنچمارک‌ها را مجبور به
                      اجرا روی یک CPU مشخص کرد تا تغییرات بین
                      اجراها به حداقل برسد.
-o FILENAME, --output FILENAME
                      اجرای بنچمارک‌ها تنها روی یک مفسر و نوشتن
                      نتایج در FILENAME. فقط baseline_python را
                      مشخص کنید، نه changed_python.
--append FILENAME     افزودن اجراها به یک فایل موجود، یا ایجاد آن
                      اگر وجود نداشته باشد
--timeout TIMEOUT     تعیین مهلت زمانی به ثانیه برای یک بار اجرای
                      بنچمارک (پیش‌فرض: غیرفعال)
--manifest MANIFEST   فایل مانیفست بنچمارک برای استفاده
-b BM_LIST, --benchmarks BM_LIST
                      فهرست جداشده با کاما از بنچمارک‌ها برای اجرا.
                      می‌تواند شامل آرگومان‌های مثبت و منفی باشد:
                      --benchmarks=run_this,also_this,-not_this.
                      اگر هیچ آرگومان مثبتی نباشد، تمام بنچمارک‌ها
                      به‌جز آرگومان‌های منفی اجرا می‌شوند؛ در غیر
                      این صورت فقط آرگومان‌های مثبت اجرا خواهند شد.
--inherit-environ VAR_LIST
                      فهرست جداشده با کاما از متغیرهای محیطی که
                      هنگام اجرای زیرپردازش‌های بنچمارک، از محیط والد
                      به ارث برده می‌شوند.
-p PYTHON, --python PYTHON
                      فایل اجرایی Python (پیش‌فرض: استفاده از
                      Python در حال اجرا)
--same-loops SAME_LOOPS
                      استفاده از همان تعداد تکرار اجرای پیشین
                      (یعنی کالیبراسیون مجدد نشود). باید مسیر یک
                      فایل .json از اجرای قبلی باشد.
--hook HOOK
                      اعمال hook مشخص‌شده از pyperf هنگام اجرای
                      بنچمارک‌ها.

نمایش یک فایل بنچمارک.

کاربرد:

show FILENAME

آرگومان‌های موضعی:

FILENAME

مقایسه دو فایل بنچمارک.

کاربرد:

pyperformance compare [-h] [-v] [-O STYLE] [--csv CSV_FILE]
                      [--inherit-environ VAR_LIST] [-p PYTHON]
                      baseline_file.json changed_file.json

آرگومان‌های موضعی:

baseline_file.json
changed_file.json

گزینه‌ها:

-v, --verbose         چاپ خروجی بیشتر
-O STYLE, --output_style STYLE
                      سبکی که خروجی بنچمارک باید به خود بگیرد.
                      گزینه‌های معتبر 'normal' و 'table' هستند.
                      پیش‌فرض normal است.
--csv CSV_FILE        نام فایلی که نتایج در آن نوشته خواهد شد،
                      به صورت یک فایل CSV سه‌ستونه شامل کمترین
                      زمان‌های اجرا برای هر بنچمارک.
--inherit-environ VAR_LIST
                      فهرست جداشده با کاما از نام‌های متغیرهای محیطی
                      که هنگام اجرای زیرفرآیندهای بنچمارک از محیط
                      والد به ارث برده می‌شوند.
-p PYTHON, --python PYTHON
                      فایل اجرایی پایتون (پیش‌فرض: استفاده از
                      پایتون در حال اجرا)

فهرست‌کردن بنچمارک‌های پایتونِ در حال اجرا.

کاربرد:

pyperformance list [-h] [--manifest MANIFEST] [-b BM_LIST]
                   [--inherit-environ VAR_LIST] [-p PYTHON]

گزینه‌ها:

--manifest MANIFEST   فایل مانیفست بنچمارک برای استفاده
-b BM_LIST, --benchmarks BM_LIST
                      فهرست جداشده با کاما از بنچمارک‌ها برای اجرا.
                      می‌تواند شامل هر دو آرگومان مثبت و منفی باشد:
                      --benchmarks=run_this,also_this,-not_this. اگر
                      هیچ آرگومان مثبتی نباشد، تمام بنچمارک‌ها به‌جز
                      آرگومان‌های منفی اجرا می‌شوند. در غیر این صورت
                      فقط آرگومان‌های مثبت اجرا می‌شوند.
--inherit-environ VAR_LIST
                      فهرست جداشده با کاما از نام متغیرهای محیطی
                      که هنگام اجرای زیرفرآیندهای بنچمارک از محیط
                      والد به ارث برده می‌شوند.
-p PYTHON, --python PYTHON
                      فایل اجرایی پایتون (پیش‌فرض: استفاده از
                      پایتون در حال اجرا)

برای فهرست‌کردن تمام بنچمارک‌ها از python3 -m pyperformance list -b all استفاده کنید..SS list_groups

فهرست گروه‌های بنچمارک Python در حال اجرا.

کاربرد:

pyperformance list_groups [-h] [--manifest MANIFEST]
                          [--inherit-environ VAR_LIST]
                          [-p PYTHON]

گزینه‌ها:

--manifest MANIFEST   فایل مانیفست بنچمارک برای استفاده
--inherit-environ VAR_LIST
                      فهرست جداشده با کاما از نام‌های متغیرهای
                      محیطی که هنگام اجرای زیرپردازش‌های بنچمارک
                      از محیط والد به ارث برده می‌شوند.
-p PYTHON, --python PYTHON
                      فایل اجرایی Python (پیش‌فرض: استفاده از
                      Python در حال اجرا)

عملیات روی محیط مجازی.

عملیات‌ها:

show      نمایش مسیر محیط مجازی و وضعیت آن
          (ایجاد شده یا خیر)
create    ایجاد محیط مجازی
recreate  اجبار به ایجاد مجدد محیط مجازی
remove    حذف محیط مجازی

گزینه‌های عمومی:

--venv VENV           مسیر محیط مجازی
--inherit-environ VAR_LIST
                      فهرست جداشده با کاما از نام‌های متغیرهای
                      محیطی که هنگام اجرای زیرپردازش‌های بنچمارک
                      از محیط والد به ارث برده می‌شوند.
-p PYTHON, --python PYTHON
                      فایل اجرایی Python (پیش‌فرض: استفاده از
                      Python در حال اجرا)

نمایش مسیر محیط مجازی و وضعیت آن (ایجاد شده یا خیر).

کاربرد:

pyperformance venv show [-h] [--venv VENV]
                        [--inherit-environ VAR_LIST] [-p PYTHON]

ایجاد محیط مجازی.

کاربرد:

pyperformance venv create [-h] [--venv VENV]
                          [--manifest MANIFEST] [-b BM_LIST]
                          [--inherit-environ VAR_LIST]
                          [-p PYTHON]

گزینه‌ها:

--manifest MANIFEST   فایل مانیفست محک مورد استفاده
-b BM_LIST, --benchmarks BM_LIST
                      فهرست محک‌های جداشده با کاما برای اجرا. می‌تواند
                      شامل هر دو آرگومان مثبت و منفی باشد:
                      --benchmarks=run_this,also_this,-not_this. اگر
                      هیچ آرگومان مثبتی نباشد، تمام محک‌ها به‌جز
                      آرگومان‌های منفی اجرا خواهند شد. در غیر این
                      صورت تنها آرگومان‌های مثبت اجرا می‌شوند.

ایجاد مجدد اجباری محیط مجازی.

کاربرد:

pyperformance venv recreate [-h] [--venv VENV]
                            [--manifest MANIFEST] [-b BM_LIST]
                            [--inherit-environ VAR_LIST]
                            [-p PYTHON]

گزینه‌ها:

--manifest MANIFEST   فایل مانیفست محک مورد استفاده
-b BM_LIST, --benchmarks BM_LIST
                      فهرست محک‌های جداشده با کاما برای اجرا. می‌تواند
                      شامل هر دو آرگومان مثبت و منفی باشد:
                      --benchmarks=run_this,also_this,-not_this. اگر
                      هیچ آرگومان مثبتی نباشد، تمام محک‌ها به‌جز
                      آرگومان‌های منفی اجرا خواهند شد. در غیر این
                      صورت تنها آرگومان‌های مثبت اجرا می‌شوند.

حذف محیط مجازی.

کاربرد:

pyperformance venv remove [-h] [--venv VENV]
                          [--inherit-environ VAR_LIST]
                          [-p PYTHON]

عملیات‌های pyperformance:

compile             کامپایل و نصب CPython و اجرای محک‌ها روی
                    پایتونِ نصب‌شده
compile_all         کامپایل و نصب CPython و اجرای محک‌ها روی
                    پایتونِ نصب‌شده در تمام شاخه‌ها و بازبینی‌های
                    CONFIG_FILE
upload              بارگذاری نتایج JSON در وب‌سایت Codespeed

تمام این دستورها به یک فایل پیکربندی نیاز دارند.

پیکربندی ساده قابل استفاده برای compile (اما نه برای compile_all و نه upload)، doc/benchmark.conf:

[config]
json_dir = ~/prog/python/bench_json
[scm]
repo_dir = ~/prog/python/master
update = True
[compile]
bench_dir = ~/prog/python/bench_tmpdir
[run_benchmark]
system_tune = True
affinity = 2,3

نمونه فایل پیکربندی به همراه توضیحات، doc/benchmark.conf.sample:

[config]
# دایرکتوری‌ای که فایل‌های JSON در آن نوشته می‌شوند.
# - فایل‌های بارگذاری‌شده به json_dir/uploaded/ منتقل می‌شوند
# - نتایج پایتون وصله‌شده در json_dir/patch/ نوشته می‌شوند
json_dir = ~/json
# اگر True باشد، CPython در حالت اشکال‌زدایی کامپایل می‌شود (LTO و PGO غیرفعال می‌شوند)،
# محک‌ها با --debug-single-sample اجرا می‌شوند و بارگذاری غیرفعال می‌گردد.
#
# از این گزینه برای بررسی سریع یک پیکربندی استفاده کنید.
debug = False
[scm]
# دایرکتوری کد منبع CPython (مخزن Git)
repo_dir = ~/cpython
# مخزن Git به‌روزرسانی شود (git fetch)؟
update = True
# نام ریموت Git، برای ایجاد بازبینیِ
# شاخهٔ Git استفاده می‌شود. به عنوان مثال، از بازبینی 'remotes/origin/3.6'
# برای شاخهٔ '3.6' استفاده کنید.
git_remote = remotes/origin
[compile]
# ایجاد فایل‌ها در bench_dir:
# - bench_dir/bench-xxx.log
# - bench_dir/prefix/: جایی که پایتون در آن نصب می‌شود
# - bench_dir/venv/: محیط مجازی استفاده‌شده توسط pyperformance
bench_dir = ~/bench_tmpdir
# بهینه‌سازی زمان پیوند (LTO)؟
lto = True
# بهینه‌سازی هدایت‌شده با پروفایل (PGO)؟
pgo = True
# کامپایلر آزمایشی درجا (JIT) ساخته شود؟
# مقادیر ممکن عبارتند از:
# - no: (پیش‌فرض) کامپایلر JIT یا مفسر micro-op ساخته نشود.
#   متغیر محیطی جدید PYTHON_JIT تأثیری ندارد.
# - yes: کامپایلر JIT ساخته شده و به‌طور پیش‌فرض فعال شود. از PYTHON_JIT=0 می‌توان
#   برای غیرفعال کردن آن در زمان اجرا استفاده کرد.
# - yes-off: کامپایلر JIT ساخته شود، اما به‌طور پیش‌فرض فعال نشود. از PYTHON_JIT=1 می‌توان
#   برای فعال کردن آن در زمان اجرا استفاده کرد.
# - interpreter: کامپایلر JIT ساخته نشود، اما مفسر micro-op ساخته و فعال شود.
#   این برای کسانی مفید است که در حال توسعه یا اشکال‌زدایی micro-opها هستند
#   (اما نمی‌خواهند با JIT سر و کله بزنند).
#   از PYTHON_JIT=0 می‌توان برای غیرفعال کردن مفسر micro-op در زمان اجرا استفاده کرد.
jit = no
# فهرستی از کتابخانه‌های جداشده با فاصله که package-only هستند،
# یعنی به‌صورت محلی نصب شده‌اند اما در مسیرهای هدر و کتابخانه قرار ندارند.
# برای هر یک از این کتابخانه‌ها، مسیر نصب تعیین شده و یک زیرمسیر مناسب
# به اعلان‌های CFLAGS و LDFLAGS که به configure ارسال می‌شوند افزوده می‌شود.
# به عنوان یک استثنا، پیشوند openssl، در صورت وجود این کتابخانه در اینجا،
# از طریق گزینهٔ --with-openssl ارسال می‌شود. در حال حاضر، این قابلیت
# فقط با Homebrew روی macOS کار می‌کند.
# در صورت اجرا روی macOS با Homebrew، احتمالاً مایلید از این استفاده کنید:
#     pkg_only = openssl readline sqlite3 xz zlib
# نسخهٔ zlib ارائه‌شده به همراه macOS نیز احتمالاً کار می‌کند،
# تا زمانی که هدرهای SDK اپل نصب شده باشند.
pkg_only =
# پایتون نصب شود؟ اگر false باشد، پایتون از دایرکتوری ساخت اجرا می‌شود
#
# هشدار: اجرای پایتون از دایرکتوری ساخت تغییرات ظریفی نسبت به اجرای
# یک پایتونِ نصب‌شده ایجاد می‌کند. علاوه بر این، ایجاد یک محیط مجازی با استفاده
# از پایتون اجراشده از دایرکتوری ساخت در موارد بسیاری با شکست مواجه می‌شود،
# به‌ویژه در پایتون‌های قدیمی‌تر از 3.4. نصب را فقط در صورتی غیرفعال کنید
# که واقعاً بدانید چه کاری انجام می‌دهید!
install = True
# پارامتر '-j' در دستور 'make' مشخص شود
jobs = 8
[run_benchmark]
# دستور "sudo python3 -m pyperf system tune" پیش از اجرای محک‌ها اجرا شود؟
system_tune = True
# گزینهٔ --manifest برای 'pyperformance run'
manifest =
# گزینهٔ --benchmarks برای 'pyperformance run'
benchmarks =
# گزینهٔ --affinity برای 'pyperf system tune' و 'pyperformance run'
affinity =
# فایل JSON تولیدشده بارگذاری شود؟
#
# بارگذاری در پایتون وصله‌شده، در حالت اشکال‌زدایی یا در صورت غیرفعال
# بودن install غیرفعال است.
upload = False
# گزینهٔ --rigorous برای 'pyperformance run'
rigorous = False
# پیکربندی برای بارگذاری نتایج در یک وب‌سایت Codespeed
[upload]
url =
environment =
executable =
project =
[compile_all]
# فهرست شاخه‌های Git مربوط به CPython
branches = default 3.6 3.5 2.7
# فهرست بازبینی‌ها برای سنجش با compile_all
[compile_all_revisions]
# فهرستی از 'sha1=' (شاخهٔ پیش‌فرض: 'master') یا 'sha1=branch'
# استفاده‌شده توسط دستور "pyperformance compile_all"
# مثلاً:
11159d2c9d6616497ef4cc62953a5c3cc8454afb =

کامپایل Python، نصب Python و اجرای محک‌ها روی Python نصب‌شده.

کاربرد:

pyperformance compile [-h] [--patch PATCH] [-U] [-T]
                      [--inherit-environ VAR_LIST] [-p PYTHON]
                      config_file revision [branch]

آرگومان‌های موضعی:

config_file           نام فایل پیکربندی
revision              بازبینی محک‌زده‌شده Python
branch                شاخه Git

گزینه‌ها:

--patch PATCH         فایل وصله
-U, --no-update       مخزن Git به‌روزرسانی نشود
-T, --no-tune         دستور 'pyperf system tune' برای تنظیم
                      سیستم جهت اجرای محک‌ها اجرا نشود
--inherit-environ VAR_LIST
                      فهرست جداشده با کاما از نام‌های متغیرهای محیطی
                      که هنگام اجرای زیرپردازش‌های محک‌زنی از
                      محیط والد به ارث برده می‌شوند.
-p PYTHON, --python PYTHON
                      فایل اجرایی Python (پیش‌فرض: استفاده از
                      Python در حال اجرا)

نکات:

•
قابلیت PGO در Ubuntu 14.04 LTS با GCC 4.8.4-2ubuntu1~14.04 کار نمی‌کند: Modules/socketmodule.c:7743:1: internal compiler error: in edge_badness, at ipa-inline.c:895

کامپایل تمام شاخه‌ها و بازبینی‌های CONFIG_FILE.

کاربرد:

pyperformance compile_all [-h] [--inherit-environ VAR_LIST] [-p PYTHON]
                          config_file

آرگومان‌های موضعی:

config_file           نام فایل پیکربندی

گزینه‌ها:

--inherit-environ VAR_LIST
                      فهرست جداشده با کاما از نام‌های متغیرهای محیطی
                      که هنگام اجرای زیرپردازش‌های محک‌زنی از
                      محیط والد به ارث برده می‌شوند.
-p PYTHON, --python PYTHON
                      فایل اجرایی Python (پیش‌فرض: استفاده از
                      Python در حال اجرا)

بارگذاری نتایج از یک فایل JSON در وب‌سایت Codespeed.

کاربرد:

pyperformance upload [-h] [--inherit-environ VAR_LIST] [-p PYTHON]
                     config_file json_file

آرگومان‌های مکانی:

config_file           نام فایل پیکربندی
json_file             نام فایل JSON

گزینه‌ها:

--inherit-environ VAR_LIST
                      فهرست جداشده با کاما از نام‌های متغیرهای
                      محیطی که هنگام اجرای زیرپردازش‌های محک‌زنی
                      از محیط والد به ارث برده می‌شوند.
-p PYTHON, --python PYTHON
                      فایل اجرایی Python (پیش‌فرض: استفاده از
                      Python در حال اجرا)

  • اجرای دستور python3 -m pyperf system tune
  • کامپایل Python با استفاده از LTO (بهینه‌سازی زمان پیوند) و PGO (بهینه‌سازی‌های هدایت‌شده با پروفایل): از دستور pyperformance compile استفاده کنید که به‌طور پیش‌فرض از LTO و PGO بهره می‌برد
  • مشاهده توصیه‌های مستندات pyperf: چگونگی دستیابی به نتایج بازتولیدپذیر محک‌زنی http://pyperf.readthedocs.io/en/latest/run_benchmark.html#how-to-get-reproductible-benchmark-results.

برای اجرای محک‌ها، pyperformance ابتدا یک محیط مجازی ایجاد می‌کند. این ابزار پیش‌نیازها را با نسخه‌های مشخص نصب می‌کند تا محیطی بازتولیدپذیر فراهم شود. Python سیستمی ممکن است ماژول‌های ناشناخته‌ای با نسخه‌های نامشخص داشته باشد و همچنین ممکن است فایل‌های .pth داشته باشد که هنگام راه‌اندازی Python اجرا می‌شوند و می‌توانند رفتار Python را تغییر دهند یا دست‌کم راه‌اندازی آن را کُند کنند.

یک محک همیشه برای هدفی مشخص نوشته می‌شود. بسته به این‌که محک چگونه نوشته شده و چگونه اجرا شود، نتیجه می‌تواند متفاوت باشد و در نتیجه مفهوم متفاوتی داشته باشد.

مجموعه محک‌های pyperformance چندین هدف را دنبال می‌کند:

  • کمک به شناسایی افت کارایی در یک پیاده‌سازی Python
  • اعتبارسنجی اینکه یک تغییر بهینه‌سازی باعث سریع‌تر شدن Python شده و افت کارایی ایجاد نکرده، یا تنها افت‌های جزئی داشته است
  • مقایسه دو پیاده‌سازی از Python، برای نمونه CPython و PyPy
  • نمایشی از کارایی Python که در حالت ایده‌آل معرف کارایی برنامه‌های کاربردی در حال اجرا در محیط عملیاتی باشد

    ماژول pyperf و بنچمارک‌های pyperformance برای تولید نتایج تکرارپذیر طراحی شده‌اند، اما نه به قیمت اجرای بنچمارک‌ها در وضعیتی خاص که برای اجرای برنامه‌ها در محیط عملیاتی استفاده نمی‌شود. به همین دلایل، زباله‌روب پایتون (Python garbage collector)، تابع هش تصادفی پایتون و ASLR (تصادفی‌سازی چیدمان فضای آدرس) سیستم غیرفعال نمی‌شوند. بنچمارک‌ها همچنین gc.collect() را فراخوانی نمی‌کنند، چرا که CPython آن را با مکانیزم توقف کامل (stop-the-world) پیاده‌سازی می‌کند https://en.wikipedia.org/wiki/Tracing_garbage_collection#Stop-the-world_vs._incremental_vs._concurrent و بدین ترتیب برنامه‌ها برای جلوگیری از افت شدید کارایی آن را فراخوانی نمی‌کنند.

علاوه بر این، در حالی که مستندات pyperf نحوه کاهش نویز تصادفی سیستم و سایر برنامه‌ها را توضیح می‌دهد، برخی از بنچمارک‌ها از سیستم استفاده می‌کنند و بنابراین بسته به بار کاری سیستم، کارایی I/O و غیره می‌توانند زمان‌بندی‌های متفاوتی داشته باشند. داده‌های پرت و جهش‌های موقت در نتایج به‌طور خودکار حذف نمی‌شوند: مقادیر به جای استفاده از میانه و انحراف مطلق میانه که داده‌های پرت را نادیده می‌گیرند، با محاسبه میانگین (میانگین حسابی) و انحراف معیار که این جهش‌ها را "شامل می‌شود" خلاصه می‌گردند. این یک انتخاب آگاهانه است، زیرا برنامه‌های در حال اجرا در محیط عملیاتی تحت تأثیر چنین کندی‌های موقتی ناشی از عوامل مختلفی مانند زباله‌روبی یا کامپایل JIT قرار می‌گیرند.

یک موضوع بینابینی، "گرم‌کردن" (warmups) بنچمارک‌ها است. مقادیر اولیه هر فرایند کارگر (worker process) همواره کندتر هستند: در بهترین حالت 10% کندتر، و در PyPy می‌تواند 1000% یا بیشتر کندتر باشد. در حال حاضر (2017-04-14)، pyperformance مقادیر اولیه‌ای را که گرم‌کردن در نظر گرفته می‌شوند نادیده می‌گیرد تا زمانی که بنچمارک به "وضعیت پایدار" (steady state) خود برسد. این "وضعیت پایدار" می‌تواند شامل جهش‌های موقت به ازای هر 5 مقدار باشد (برای نمونه: ناشی از زباله‌روب)، و همچنان می‌تواند بهینه‌سازی‌های بیشتری از کامپایلر JIT را به دنبال داشته باشد اما با تأثیری "اندک" بر میانگین pyperformance.

جهت شفافیت، "گرم‌کردن" و "وضعیت پایدار" موضوعاتی در حال توسعه و مباحثی بسیار پیچیده هستند، به‌ویژه در PyPy و کامپایلر JIT آن.

ابزاری برای مقایسه کارایی دو پیاده‌سازی پایتون.

دستور pyperformance آزمون تی دو دامنه‌ای استیودنت (Student's two-tailed T test) را با سطح اطمینان 95% روی نتایج بنچمارک اجرا می‌کند تا نشان دهد که آیا اختلاف مشاهده‌شده از نظر آماری معنادار است یا خیر.

حذف گزینه -b منجر به اجرای گروه پیش‌فرض بنچمارک‌ها می‌شود؛ حذف -b همانند مشخص کردن -b default است.

برای اجرای تمام بنچمارک‌هایی که pyperformance می‌شناسد، از -b all استفاده کنید. برای مشاهده فهرست کامل همه بنچمارک‌های موجود، از --help استفاده کنید.

مشخص کردن منفی بنچمارک‌ها نیز پشتیبانی می‌شود: -b -2to3 همه بنچمارک‌های گروه پیش‌فرض را به جز 2to3 اجرا خواهد کرد (این کار مشابه -b default,-2to3 است). گزینه -b all,-django همه بنچمارک‌ها به جز بنچمارک الگوهای Django را اجرا می‌کند. گروه‌های منفی (مانند -b -default) پشتیبانی نمی‌شوند. بنچمارک‌های مثبت پیش از کسر بنچمارک‌های منفی تجزیه می‌شوند.

اگر گزینه --track_memory داده شود، pyperformance به‌طور مداوم مصرف حافظه بنچمارک را نمونه‌برداری می‌کند. این ویژگی در حال حاضر فقط روی لینوکس 2.6.16 و بالاتر، یا ویندوز با PyWin32 کار می‌کند. از آنجا که --track_memory هنگام جمع‌آوری اندازه‌گیری‌های حافظه نوسان (jitter) کارایی ایجاد می‌کند، در گزارش نهایی تنها مصرف حافظه گزارش می‌شود.

همچنین برای نحوه ایجاد بنچمارک‌های خود یا استفاده از بنچمارک‌های دیگران، بخش Custom Benchmarks <> را ببینید.

مشابه بنچمارک‌های تکی (به "بنچمارک‌های دردسترس" در زیر نگاه کنید)، استفاده از گروه‌های بنچمارک نیز پس از گزینه -b مجاز است. از دستور python3 -m pyperformance list_groups برای فهرست کردن گروه‌ها و بنچمارک‌های آن‌ها استفاده کنید.

گروه‌های بنچمارک دردسترس:

  • all: گروهی شامل تمام بنچمارک‌ها
  • apps: بنچمارک‌های کاربردی "سطح بالا" (مانند 2to3، Chameleon و Tornado HTTP)
  • default: گروهی از بنچمارک‌ها که به‌طور پیش‌فرض توسط دستور run اجرا می‌شوند
  • math: اعداد ممیز شناور و صحیح
  • regex: مجموعه‌ای از بنچمارک‌های عبارات منظم
  • serialize: بنچمارک‌های مربوط به ماژول‌های pickle و json
  • startup: مجموعه‌ای از ریزبنچمارک‌ها با تمرکز بر زمان راه‌اندازی (start-up) مفسر پایتون.
  • template: کتابخانه‌های قالب‌ساز

از دستور python3 -m pyperformance list_groups برای فهرست کردن گروه‌ها و بنچمارک‌های آن‌ها استفاده کنید..SS بنچمارک‌های موجود

در pyperformance 0.5.5، ریزبنچمارک‌های زیر حذف شده‌اند زیرا بسیار کوتاه‌اند، نمایندهٔ برنامه‌های کاربردی واقعی نیستند و بیش از حد ناپایدارند.

  • call_method_slots
  • call_method_unknown
  • call_method
  • call_simple
  • pybench

اجرای ابزار 2to3 بر روی دایرکتوری pyperformance/benchmarks/data/2to3/: رونوشتی از ۹ فایل django/core/*.py مربوط به Django 1.1.4.

اجرای دستور python -m lib2to3 -f all <files> که در آن python همان sys.executable است. بنابراین این آزمون تنها کارایی خود Python را نمی‌سنجد، بلکه کارایی ماژول lib2to3 را نیز می‌سنجد که می‌تواند بسته به نسخهٔ Python تغییر کند.

نکته:

فایل‌ها به جای .py با پسوند .py.txt نام‌گذاری شده‌اند تا بررسی‌های PEP 8 روی آن‌ها اعمال نشود و به‌طور کلی‌تر، تغییری در آن‌ها ایجاد نگردد.

بنچمارک بار کاری ناهمگام (Async)، که تابع asyncio.gather() را روی یک درخت (با عمق ۶ سطح و ۶ شاخه در هر سطح) فراخوانی می‌کند، در حالی که گره‌های برگ کارهای [احتمالاً] ناهمگام را شبیه‌سازی می‌کنند (بسته به گونهٔ بنچمارک). گونه‌های موجود:

  • async_tree: بدون هیچ کار ناهمگام واقعی در هیچ‌کدام از گره‌های برگ.
  • async_tree_io: تمام گره‌های برگ، بار کاری IO ناهمگام را شبیه‌سازی می‌کنند (خواب ناهمگام به مدت ۵۰ میلی‌ثانیه).
  • async_tree_memoization: تمام گره‌های برگ، بار کاری IO ناهمگام را شبیه‌سازی می‌کنند در حالی که ۹۰٪ داده‌ها به‌خاطرسپرده (memoize) شده‌اند.
  • async_tree_cpu_io_mixed: نیمی از گره‌های برگ بار کاری وابسته به پردازنده (CPU-bound) را شبیه‌سازی می‌کنند (math.factorial(500)) و نیم دیگر بار کاری مشابه با گونهٔ async_tree_memoization را شبیه‌سازی می‌کنند.

این بنچمارک‌ها همچنین در صورت دردسترس بودن، دارای گونهٔ "eager" هستند که از eager task factory ماژول asyncio استفاده می‌کند.

سنجش کارایی توابع کدگذاری و رمزگشایی ماژول base64. هر الگوریتم دارای گونه‌های _small و _large است که هر دو عمل کدگذاری و رمزگشایی را در یک بنچمارک واحد می‌سنجند:

  • _small: تکرارهای متعادل میان اندازه‌های دادهٔ 20B، 127B، 3KiB و 9KB که بیشتر احتمال دارد اثر سربار را نشان دهند.
  • _large: تمرکز بر داده‌های بزرگ با اندازه‌های 100KiB و حدود 1MiB که احتمالاً بازدهی پیاده‌سازی را نشان می‌دهند.

بنچمارک‌های موجود:

  • base64_small، base64_large: کدگذاری و رمزگشایی استاندارد Base64
  • urlsafe_base64_small: کدگذاری Base64 امن برای URL (تنها نسخهٔ کوچک، زیرا نشانی‌های وب نباید حاوی داده‌های بسیار بزرگ باشند)
  • base32_small، base32_large: کدگذاری و رمزگشایی Base32
  • base16_small، base16_large: کدگذاری و رمزگشایی Base16/hex
  • ascii85_small، ascii85_large: کدگذاری و رمزگشایی Ascii85 (شامل مسیر کد wrapcol=76)
  • base85_small، base85_large: کدگذاری و رمزگشایی Base85

ماژول base64 را ببینید: https://docs.python.org/dev/library/base64.html..SS chameleon

رندر کردن یک قالب با استفاده از ماژول chameleon برای ایجاد یک جدول HTML با ۵۰۰ سطر و ۱۰ ستون.

کلاس chameleon.PageTemplate را ببینید.

ایجاد فرکتال‌های مشابه بازی آشوب (chaosgame). گزینه‌های خط فرمان:

--thickness THICKNESS
                      ضخامت (پیش‌فرض: 0.25)
--width WIDTH         عرض تصویر (پیش‌فرض: 256)
--height HEIGHT       ارتفاع تصویر (پیش‌فرض: 256)
--iterations ITERATIONS
                      تعداد تکرارها (پیش‌فرض: 5000)
--filename FILENAME.PPM
                      نام فایل خروجی تصویر PPM
--rng-seed RNG_SEED   بذر تولیدکننده عدد تصادفی (پیش‌فرض: 1234)

هنگامی که گزینهٔ --filename استفاده می‌شود، زمان‌سنجی شامل زمان ایجاد فایل PPM نیز می‌شود.

حق نشر (C) 2005 Carl Friedrich Bolz [تصویر: بازی آشوب، بنچ‌مارک bm_chaos] [تصویر]

تصویر تولیدشده توسط bm_chaos (روی CPython 3.5 ۳ ثانیه طول کشید) با دستور:

python3 pyperformance/benchmarks/bm_chaos.py --worker -l1 -w0 -n1 --filename chaos.ppm --width=512 --height=512 --iterations 50000

بنچ‌مارک یک پیاده‌سازی پایتون خالص از رمز قطعه‌ای AES در حالت CTR با استفاده از ماژول pyaes.

این بنچ‌مارک روی CPython 3 در مقایسه با CPython 2.7 کندتر است، زیرا CPython 3 دیگر نوع دادهٔ "small int" (int) را ندارد. نوع int در CPython 3 اکنون همیشه دارای اندازهٔ دلخواه است، مانند نوع long در CPython 2.7.

پروژهٔ pyaes در https://github.com/ricmoo/pyaes را ببینید: یک پیاده‌سازی پایتون خالص از الگوریتم رمز قطعه‌ای AES و حالت‌های عملیاتی رایج (CBC، CFB، CTR، ECB و OFB).

بنچ‌مارک متد copy.deepcopy پایتون. متد deepcopy روی یک دیکشنری تو در تو و یک dataclass اجرا می‌شود.

بنچ‌مارک DeltaBlue

پورت‌شده برای پروژهٔ PyPy. با مشارکت Daniel Lindsley

این پیاده‌سازی از بنچ‌مارک DeltaBlue مستقیماً از کد منبع V8 در https://github.com/v8/v8/blob/master/benchmarks/deltablue.js پورت شده است، که آن هم به نوبهٔ خود از پیاده‌سازی Smalltalk توسط John Maloney و Mario Wolczko مشتق شده بود. پیاده‌سازی اصلی Javascript تحت پروانهٔ GPL منتشر شده بود.

در بخش‌هایی به‌روزرسانی شده تا با سبک پایتون سازگارتر باشد (حلقه‌های for روی مجموعه‌ها، چند متد جادویی، استفاده از یک لیست برای OrderedCollection، و تغییر مواردی که این مجموعه‌ها را دستکاری می‌کردند به متدهای توکار) اما تا حد زیادی ساختار و منطق نسخهٔ اصلی را حفظ کرده است. (اه!)

استفاده از سیستم قالب‌بندی Django برای ساخت یک جدول HTML با ۱۵۰×۱۵۰ خانه.

از کلاس‌های Context و Template از ماژول django.template استفاده می‌کند.

پیمایش روی کامیت‌های مخزن گیت asyncio با استفاده از ماژول Dulwich. از مخزن pyperformance/benchmarks/data/asyncio.git/ استفاده می‌کند.

شبه‌کد بنچ‌مارک:

repo = dulwich.repo.Repo(repo_path)
head = repo.head()
for entry in repo.get_walker(head):
    pass

پروژهٔ Dulwich در https://www.dulwich.io را ببینید..SS docutils

استفاده از Docutils https://docutils.sourceforge.io برای تبدیل مستندات Docutils به HTML. نمونه‌ای از ساخت یک مجموعه مستندات با اندازه متوسط.

پروژه The Computer Language Benchmarks Game: http://benchmarksgame.alioth.debian.org

ارائه‌شده توسط Sokolov Yura، اصلاح‌شده توسط Tupteq.

بنچمارک ساختگی با محاسبات سنگین ممیز شناور که در اصل توسط Factor استفاده شده است.

ایجاد ۱۰۰٬۰۰۰ شیء point که math.cos()، math.sin() و math.sqrt() را محاسبه می‌کنند.

تغییریافته در نسخه 0.5.5: استفاده از __slots__ در کلاس Point جهت تمرکز بنچمارک روی ممیز شناور به جای آزمودن کارایی ویژگی‌های کلاس.

رندر کردن یک قالب با استفاده از Genshi (ماژول genshi.template):

  • genshi_text: رندر کردن یک قالب HTML با استفاده از کلاس NewTextTemplate
  • genshi_xml: رندر کردن یک قالب XML با استفاده از کلاس MarkupTemplate

پروژه Genshi را ببینید: http://pythonhosted.org/Genshi.

هوش مصنوعی برای انجام بازی تخته‌ای Go. از Zobrist hashing استفاده می‌کند https://en.wikipedia.org/wiki/Zobrist_hashing.

حل‌کننده بازی تخته‌ای Hexiom (به‌طور پیش‌فرض سطح ۲۵). گزینه خط فرمان:

--level {2,10,20,25,30,36}   Hexiom board level (default: 25)

دریافت صفحه راهنمای Mercurial.

سنجش کارایی دستور python path/to/hg help با استفاده از pyperf.Runner.bench_command()، که در آن python همان sys.executable و path/to/hg برنامه Mercurial نصب‌شده در یک محیط مجازی است.

تابع bench_command() خروجی‌های stdout و stderr را به /dev/null هدایت می‌کند.

پروژه Mercurial را ببینید: https://www.mercurial-scm.org.

تجزیه فایل HTML با نام pyperformance/benchmarks/data/w3_tr_html5.html (۱۳۲ کیلوبایت) با استفاده از html5lib. این فایل همان مشخصات HTML 5 است، اما کوتاه شده است تا تجزیه آن در کمتر از ۱ ثانیه (حدود ۲۵۰ میلی‌ثانیه) انجام شود.

روی CPython، پس از ۳ مرحله گرم‌کردن (warmup)، بنچمارک وارد چرخه‌ای از ۵ مقدار می‌شود: هر پنجمین مقدار ۱۰٪ کندتر است. نمودار ۱ اجرا از ۵۰ مقدار (مرحله گرم‌کردن ترسیم نشده است): [image: html5lib values] [image]

پروژه html5lib را ببینید: https://html5lib.readthedocs.io.

سنجش کارایی توابع dumps() و loads() از ماژول json.

گزینه خط فرمان bm_json_dumps.py:

--cases CASES         Comma separated list of cases. Available cases: EMPTY,
                      SIMPLE, NESTED, HUGE. By default, run all cases.

بنچمارک‌ها روی ماژول logging:

  • logging_format: بنچمارک logger.warn(fmt, str)
  • logging_simple: بنچمارک logger.warn(msg)
  • logging_silent: بنچمارک logger.debug(msg) هنگامی که لاگ نادیده گرفته می‌شود

گزینهٔ خط فرمان اسکریپت:

format
silent
simple

ماژول logging را ببینید https://docs.python.org/dev/library/logging.html.

استفاده از سیستم قالب Mako برای ساخت یک جدول HTML با ابعاد 150x150 سلول. شامل:

  • دو وراثت قالب
  • گریزدهی HTML، گریزدهی XML، گریزدهی URL و هرس فاصله‌های خالی
  • تعریف و فراخوانی توابع
  • حلقه‌های for

پروژهٔ Mako را ببینید http://docs.makotemplates.org.

نبرد همراه با خسارت‌ها و مرتب‌سازی توپولوژیکی گره‌ها در یک گراف.

مرتب‌سازی توپولوژیکی را ببینید https://en.wikipedia.org/wiki/Topological_sorting.

حل‌کننده برای صفحه پازل Meteor.

صفحه پازل Meteor: http://benchmarksgame.alioth.debian.org/u32/meteor-description.html#meteor

پروژهٔ The Computer Language Benchmarks Game: http://benchmarksgame.alioth.debian.org

ارائه شده توسط Daniel Nanz، 2008-08-21.

بنچمارک N-body از The Computer Language Benchmarks Game. میکروبنچمارک روی محاسبات ممیز شناور.

این مورد برای پشتیبانی از perf.py متعلق به Unladen Swallow در نظر گرفته شده است. بر همین اساس، نسبت به نسخهٔ Shootout تغییر یافته است:

  • پذیرش گزینه‌های استاندارد بنچمارک Unladen Swallow.
  • اجرای report_energy()/advance() در یک حلقه.
  • پیاده‌سازی دوبارهٔ itertools.combinations() برای سازگاری با نسخه‌های قدیمی‌تر Python.

برگرفته از: <http://benchmarksgame.alioth.debian.org/u64q/program.php?test=nbody&lang=python3&id=1>

ارائه شده توسط Kevin Carson. تغییریافته توسط Tupteq، Fredrik Johansson و Daniel Nanz.

  • python_startup: اندازه‌گیری زمان راه‌اندازی Python، اجرای python -c pass که در آن python همان sys.executable است
  • python_startup_nosite: اندازه‌گیری زمان راه‌اندازی Python بدون وارد کردن ماژول site، اجرای python -S -c pass که در آن python همان sys.executable است

اجرای بنچمارک با pyperf.Runner.bench_command()..SS nqueens

حل‌کننده ساده و جستجوی جامع (brute-force) برای معمای N-وزیر.

معمای هشت وزیر را ببینید: https://en.wikipedia.org/wiki/Eight_queens_puzzle.

سنجش کارایی عملیات ماژول pathlib از کتابخانه استاندارد.

این بنچمارک بر ایجاد اشیاء کوچک، الگوخوانی مسیر (globbing) و فراخوانی‌های سیستمی فشار وارد می‌کند.

مستندات ماژول pathlib را ببینید: https://docs.python.org/dev/library/pathlib.html.

بنچمارک‌های pickle (سریال‌سازی):

  • pickle: استفاده از ماژول cPickle برای پیکل کردن مجموعه‌داده‌های مختلف.
  • pickle_dict: ریز‌بنچمارک؛ استفاده از ماژول cPickle برای پیکل کردن تعداد زیادی dict.
  • pickle_list: ریز‌بنچمارک؛ استفاده از ماژول cPickle برای پیکل کردن تعداد زیادی list.
  • pickle_pure_python: استفاده از ماژول خالص پایتونی pickle برای پیکل کردن مجموعه‌داده‌های مختلف.

بنچمارک‌های unpickle (دی‌سریال‌سازی):

  • unpickle: استفاده از ماژول cPickle برای آن‌پیکل کردن مجموعه‌داده‌های مختلف.
  • unpickle_list
  • unpickle_pure_python: استفاده از ماژول خالص پایتونی pickle برای آن‌پیکل کردن مجموعه‌داده‌های مختلف.

محاسبه ۲٬۰۰۰ رقم از π. این بنچمارک بر محاسبات اعداد صحیح بزرگ فشار می‌آورد.

گزینه‌ خط فرمان:

--digits DIGITS     تعداد ارقام محاسبه‌شده پی (پیش‌فرض: 2000)

برگرفته از کد در: http://benchmarksgame.alioth.debian.org

بنچمارک ازفشرده‌ساز bzip2 با پایتون خالص: باز کردن فایل pyperformance/benchmarks/data/interpreter.tar.bz2 در حافظه از حالت فشرده.

کپی‌رایت 2006--2007-01-21 متعلق به Paul Sladen: http://www.paul.sladen.org/projects/compression

شما می‌توانید این کد را تحت هر یک از مجوزهای سازگار با DFSG (مانند BSD یا GNU GPLv2) استفاده و توزیع کنید.

رمزگشا/ازفشرده‌ساز مستقل DEFLATE (gzip) و bzip2 با پایتون خالص. این ابزار احتمالاً برای اهداف پژوهشی/ایجاد نمایه کاربردی‌تر است؛ مسلماً در بخش تطبیق‌دهنده بیتی هافمن هنوز جای بهبود وجود دارد.

در پیاده‌سازیِ موجود، اشکال شناخته‌شده‌ای در رمزگشایی BWT مربوط به رشته‌های تکراری وجود داشت. این مشکل دور زده شده است؛ 'bwt_reverse()' را ببینید. در تمام موارد آزمون خروجی صحیح تولید می‌شود، اما در حالت ایده‌آل باید ریشه مشکل پیدا می‌شد...

ردیاب پرتو (raytracer) ساده.

گزینه‌های خط فرمان:

--width WIDTH             عرض تصویر (پیش‌فرض: 100)
--height HEIGHT           ارتفاع تصویر (پیش‌فرض: 100)
--filename FILENAME.PPM   نام فایل خروجی تصویر PPM

این فایل حاوی تعاریفی برای یک ردیاب پرتو ساده است. کپی‌رایت Callum و Tony Garnock-Jones، سال 2008.

این فایل را می‌توان آزادانه تحت مجوز MIT بازتوزیع کرد، http://www.opensource.org/licenses/mit-license.php

از https://leastfixedpoint.com/tonyg/kcbbs/lshift_archive/toy-raytracer-in-python-20081029.html [تصویر: Pure Python raytracer] [تصویر]

تصویر تولیدشده با دستور (در CPython 3.5 حدود 68.4 ثانیه زمان برد):

python3 pyperformance/benchmarks/bm_raytrace.py --worker --filename=raytrace.ppm  -l1 -w0 -n1 -v --width=800 --height=600

تحت فشار قرار دادن کارایی کامپایلر regex در Python، به‌جای سرعت اجرای آن.

سنجش میزان سرعت پیاده‌سازی regex در Python در کامپایل عبارات باقاعده.

ما تمام عبارات باقاعده استفاده‌شده توسط دیگر بنچمارک‌های regex را گردآوری کرده، با جایگزینی ماژول re با یک نسخهٔ ساختگی (stub) آن‌ها را به دام می‌اندازیم و سپس آن عبارات باقاعده را مکرراً کامپایل می‌کنیم. ما در حافظهٔ پنهان ماژول re دست‌کاری می‌کنیم تا آن را وادار کنیم هر عبارت باقاعده‌ای را که به آن می‌دهیم مجدداً کامپایل کند.

بنچمارک regex DNA با استفاده از "fasta" برای ایجاد مورد آزمون.

مسابقه بنچمارک زبان‌های رایانه‌ای (The Computer Language Benchmarks Game) http://benchmarksgame.alioth.debian.org

برنامه شماره ۵ regex-dna در Python 3: ارائه‌شده توسط Dominique Wahli 2to3 اصلاح‌شده توسط Justin Peel

برنامه شماره ۳ fasta در Python 3: اصلاح‌شده توسط Ian Osgood اصلاح مجدد توسط Heinrich Acker اصلاح‌شده توسط Justin Peel اصلاح‌شده توسط Christopher Sean Forgeron

برخی از بنچمارک‌های اصلی مورد استفاده برای تنظیم و بهینه‌سازی موتور regex فعلی در خط اصلی توسعهٔ Python.

پورت بنچمارک regex موتور V8 برای Python.

تولیدشده به‌صورت خودکار در 2009-01-30.

این بنچمارک با بارگذاری ۵۰ صفحه از محبوب‌ترین صفحات وب و ثبت تمامی عملیات regexp انجام‌شده تولید شده است. به هر عملیات وزنی اختصاص می‌یابد که از تخمین محبوبیت صفحاتی که در آن‌ها رخ می‌دهد و تعداد دفعات اجرای آن هنگام بارگذاری هر صفحه محاسبه شده است. در نهایت، حروف نویسه‌ای در داده‌ها با استفاده از ROT13 به‌گونه‌ای رمزگذاری شده‌اند که بر نحوهٔ تطابق regexp با ورودی‌هایشان تأثیری نداشته باشد.

برای Unladen Swallow به Python پورت شده است. نسخهٔ اصلی JS را می‌توان در https://github.com/v8/v8/blob/master/benchmarks/regexp.js، r1243 یافت.

بنچمارک کلاسیک Richards در Python.

بر پایه یک نسخهٔ Java.

بر اساس نسخهٔ اصلی نوشته‌شده به زبان BCPL توسط Dr Martin Richards در سال ۱۹۸۱ در آزمایشگاه رایانهٔ دانشگاه کمبریج، انگلستان و یک نسخهٔ C++ برگرفته از نسخهٔ Smalltalk نوشته‌شده توسط L Peter Deutsch.

نسخهٔ Java: حق نشر (C) ۱۹۹۵ Sun Microsystems, Inc. ترجمه‌شده از C++ توسط Mario Wolczko، حلقه بیرونی اضافه‌شده توسط Alex Jacoby.

سایت MathWorld: "مسائل چالش صد دلاری، صد رقمی"، چالش شماره ۳. http://mathworld.wolfram.com/Hundred-DollarHundred-DigitChallengeProblems.html

مسابقه بنچمارک زبان‌های رایانه‌ای (The Computer Language Benchmarks Game) http://benchmarksgame.alioth.debian.org/u64q/spectralnorm-description.html#spectralnorm

ارائه‌شده توسط Sebastien Loisel. تصحیح‌شده توسط Isaac Gouy. افزایش سرعت توسط Josh Goldfoot. افزایش سرعت با ترفندهای نامتعارف (dirtily sped up) توسط Simon Descarpentries. پیاده‌سازی همزمانی توسط Jason Stitt..SS sqlalchemy_declarative, sqlalchemy_imperative

  • sqlalchemy_declarative: محک SQLAlchemy Declarative با استفاده از SQLite
  • sqlalchemy_imperative: محک SQLAlchemy Imperative با استفاده از SQLite

پروژهٔ SQLAlchemy را ببینید: https://www.sqlalchemy.org.

محک توابع تجمیعی پایتون برای SQLite.

هدف این محک (نوشته‌شده برای PyPy) سنجش کارایی CFFI و تبادلات زیاد رفت‌وبرگشتی میان SQLite و Python است. بنابراین، خود پرس‌وجوها بسیار ساده هستند.

پروژهٔ SQLite را در https://www.sqlite.org و ماژول sqlite3 پایتون (stdlib) را در https://docs.python.org/dev/library/sqlite3.html ببینید.

محک روی ماژول sympy:

  • sympy_expand: محک sympy.expand()
  • sympy_integrate: محک sympy.integrate()
  • sympy_str: محک str(sympy.expand())
  • sympy_sum: محک sympy.summation()

در CPython، برخی از مقادیر sympy_sum بین ۵٪ تا ۱۰٪ کندتر هستند:

$ python3 -m pyperf dump sympy_sum.json
Run 1: 1 warmup, 50 values, 1 loop
- warmup 1: 404 ms (+63%)
- value 1: 244 ms
- value 2: 245 ms
- value 3: 258 ms <----
- value 4: 245 ms
- value 5: 245 ms
- value 6: 279 ms (+12%) <----
- value 7: 246 ms
- value 8: 244 ms
- value 9: 245 ms
- value 10: 255 ms <----
- value 11: 245 ms
- value 12: 245 ms
- value 13: 256 ms <----
- value 14: 248 ms
- value 15: 245 ms
- value 16: 245 ms
...

نمودار ۱ اجرا از ۵۰ مقدار (مرحلهٔ گرم‌کردن [warmup] رسم نشده است): [تصویر: مقادیر sympy_sum] [تصویر]

پروژهٔ sympy را ببینید: http://www.sympy.org.

محک Telco برای سنجش کارایی محاسبات ده‌دهی (اعشاری):

  • http://speleotrove.com/decimal/telco.html
  • http://speleotrove.com/decimal/telcoSpec.html
  • یک شناسهٔ نوع تماس، c، از کم‌ارزش‌ترین بیت (least significant bit) مدت‌زمان تنظیم می‌شود (از این رو c برابر 0 یا 1 است).
  • یک نرخ، r، از روی نوع تماس تعیین می‌شود. تماس‌هایی با c=0 دارای نرخ پایین r هستند: 0.0013؛ باقی آن‌ها (تماس‌های راه دور یا «distance calls») دارای نرخ ویژهٔ r هستند: 0.00894. (نرخ‌ها، بسیار تقریبی، بر حسب یورو یا دلار در ثانیه هستند.)
  • سپس هزینهٔ تماس، p، محاسبه می‌شود (p=r*n). این مقدار با استفاده از روش گرد کردن به نزدیک‌ترین زوج (round-half-even یا روش بانکدار) دقیقاً تا ۲ رقم اعشار گرد می‌شود.
  • مالیات پایه، b، محاسبه می‌شود: b=p*0.0675 (۶.۷۵٪). این مقدار دقیقاً تا ۲ رقم اعشار بریده می‌شود (گرد کردن به پایین)، و سپس متغیر مجموع مالیات پایه افزایش می‌یابد (sumB=sumB+b).
  • برای تماس‌های راه دور: مالیات مسافت، d، محاسبه می‌شود: d=p*0.0341 (۳.۴۱٪). این مقدار دقیقاً تا ۲ رقم اعشار بریده می‌شود (گرد کردن به پایین)، و سپس متغیر مجموع مالیات مسافت افزایش می‌یابد (sumD=sumD+d).
  • هزینهٔ کل، t، محاسبه می‌شود (t=p+b، و اگر تماس راه دور باشد، t=t+d).
  • متغیر مجموع هزینه‌ها افزایش می‌یابد (sumT=sumT+t).
  • هزینهٔ کل، t، به یک رشته، s تبدیل می‌شود.

این محک پایتون با ماژول decimal پیاده‌سازی شده است.

ماژول decimal پایتون (stdlib) را ببینید: https://docs.python.org/dev/library/decimal.html..SS tornado_http

بنچمارک سرور HTTP مربوط به ماژول tornado

پروژه Tornado را ببینید http://www.tornadoweb.org.

میکروبنچمارک برای باز کردن (unpacking) لیست‌ها و تاپل‌ها.

شبه‌کد:

a, b, c, d, e, f, g, h, i, j = to_unpack

که در آن to_unpack برابر با tuple(range(10)) یا list(range(10)) است.

بنچمارک API مربوط به ElementTree از ماژول xml.etree:

  • xml_etree_generate: ایجاد یک سند XML
  • xml_etree_iterparse: بنچمارک etree.iterparse()
  • xml_etree_parse: بنچمارک etree.parse()
  • xml_etree_process: پردازش یک سند XML

ماژول xml.etree.ElementTree پایتون (stdlib) را ببینید https://docs.python.org/dev/library/xml.etree.elementtree.html.

ابزار pyperformance شامل مجموعه‌ای از بنچمارک‌های پیش‌فرض خود است (بخش Benchmarks <> را ببینید). با این حال، از بنچمارک‌های سفارشی نیز پشتیبانی می‌کند.

برای استفاده از بنچمارک‌های سفارشی، باید از گزینه خط فرمان --manifest استفاده کرده و مسیر فایل مانیفست توصیف‌کننده آن بنچمارک‌ها را ارائه دهید.

pyperformance از دو قالب فایل برای شناسایی بنچمارک‌ها استفاده می‌کند:

  • manifest - مجموعه‌ای از بنچمارک‌ها
  • metadata - یک بنچمارک منفرد

برای هر بنچمارک، دو فایل الزامی و چندین فایل اختیاری وجود دارد. انتظار می‌رود این فایل‌ها در یک ساختار دایرکتوری مشخص قرار داشته باشند (مگر اینکه در متادیتا سفارشی‌سازی شده باشد).

این ساختار (به زیر مراجعه کنید) به گونه‌ای است که نگهداری یک بنچمارک (یا مجموعه‌ای از بنچمارک‌ها) در GitHub و توزیع آن در PyPI را آسان می‌کند. همچنین انتشار بنچمارک‌های یک پروژه پایتون را ساده می‌سازد. راهکار جایگزین، ارجاع دادن افراد به یک مخزن است.

بنچمارک‌ها می‌توانند متادیتا را از فایل‌های متادیتای دیگر به ارث ببرند. این قابلیت برای نگهداری متادیتای مشترک یک مجموعه بنچمارک (مانند "version") در یک فایل مفید است. به همین ترتیب، بنچمارک‌های یک پروژه پایتون می‌توانند متادیتا را از فایل pyproject.toml پروژه به ارث ببرند.

گاهی اوقات یک بنچمارک دارای یک یا چند نگارش متغیر (variant) است که با استفاده از همان اسکریپت اجرا می‌شوند. چنین متغیرهایی بدون نیاز به تلاش اضافی زیاد توسط pyperformance پشتیبانی می‌شوند.

به‌طور معمول یک بنچمارک ساختاری به این شکل دارد:

bm_NAME/
   data/  # if needed
   requirements.txt  # lock file, if any
   pyproject.toml
   run_benchmark.py

(به پیشوند "bm_" در نام دایرکتوری توجه کنید.)

فایل "pyproject.toml" حاوی متادیتا است. فایل "run_benchmark.py" کد واقعی بنچمارک را در خود دارد. هر دو مورد الزامی هستند.

pyperformance با فایل متادیتا به عنوان منبع بنیادین اطلاعات درباره یک بنچمارک رفتار می‌کند. مانیفست برای یک مجموعه بنچمارک، در عمل یک نگاشت از نام‌ها به فایل‌های متادیتا است. بنابراین فایل متادیتا ضروری است. این فایل می‌تواند در هر کجای دیسک قرار گیرد. با این حال، اگر در ساختاری که در بالا توضیح داده شد قرار نداشته باشد، متادیتا باید مشخص کند که سایر فایل‌ها در کجا قرار دارند.

به غیر از آن، تنها یک اسکریپت بنچمارک (مانند "run_benchmark.py" در بالا) مورد نیاز است. تمام فایل‌های دیگر اختیاری هستند.

هنگامی که یک بنچمارک دارای متغیرها (variants) باشد، هر کدام فایل متادیتای اختصاصی خود را در کنار "pyproject.toml" معمولی و با نام "bm_NAME.toml" خواهند داشت. (به پیشوند "bm_" توجه کنید.) قالب فایل‌های متادیتای این متغیرها کاملاً یکسان است. pyperformance به همان صورت با آن‌ها رفتار می‌کند، با این تفاوت که "pyproject.toml" همجوار به‌طور پیش‌فرض به ارث برده می‌شود..SS فایل‌های مانیفست (Manifest Files)

یک فایل مانیفست مجموعه‌ای از بنچ‌مارک‌ها و همچنین (به‌طور اختیاری) نحوه گروه‌بندی آن‌ها را مشخص می‌کند. pyperformance از مانیفست برای تعیین اینکه کدام بنچ‌مارک‌ها برای اجرا در دسترس هستند (و در نتیجه کدام موارد به‌طور پیش‌فرض اجرا شوند) استفاده می‌کند.

یک مانیفست معمولاً به این صورت است:

[benchmarks]
name        metafile
bench1      somedir/bm_bench1/pyproject.toml
bench2      somedir/pyproject.toml
bench3      ../anotherdir

بخش "benchmarks" جدولی با ردیف‌هایی از مقادیر جداشده با تب (tab-separated-values) است. مقدار "name" نحوه شناسایی بنچ‌مارک توسط pyperformance را تعیین می‌کند. مقدار "metafile" مکانی است که pyperformance در آن به دنبال متادیتای بنچ‌مارک می‌گردد. اگر یک metafile یک دایرکتوری باشد، در آن دایرکتوری به دنبال "pyproject.toml" می‌گردد.

بخش‌های دیگر در فایل مانیفست مربوط به گروه‌بندی هستند:

[benchmarks]
name        metafile
bench1      somedir/bm_bench1
bench2      somedir/bm_bench2
bench3      anotherdir/mybench.toml
[groups]
tag1
tag2
[group default]
bench2
bench3
[group tricky]
bench2

بخش "groups" گروه‌های در دسترسی را مشخص می‌کند که ممکن است توسط برچسب‌های بنچ‌مارک شناسایی شوند (درباره برچسب‌ها در بخش متادیتا در زیر را ببینید). هر بخش گروه دیگری در مانیفست به‌طور خودکار به فهرست گروه‌های موجود اضافه می‌شود.

اگر هیچ گروه "default" مشخص نشده باشد، گروهی به‌طور خودکار با تمام بنچ‌مارک‌های موجود در بخش "benchmarks" اضافه می‌شود. اگر هیچ بخش "groups" و هیچ بخش گروه مجزایی (به جز "default") وجود نداشته باشد، مجموعه تمام برچسب‌های بنچ‌مارک‌های شناخته‌شده به‌عنوان "groups" در نظر گرفته می‌شود. همچنین گروهی با نام "all" به‌طور خودکار اضافه می‌شود که شامل تمام بنچ‌مارک‌های شناخته‌شده است.

بنچ‌مارک‌ها می‌توانند با استفاده از یک پیشوند - (منها) از یک گروه حذف شوند. هر بنچ‌مارکی که از قبل در فهرست باشد (در آن نقطه) و مطابقت داشته باشد، از فهرست حذف خواهد شد. اگر اولین ورودی در بخش یک حذف (استثنا) باشد، ابتدا تمام بنچ‌مارک‌های شناخته‌شده به فهرست اضافه می‌شوند و سپس حذف اعمال می‌گردد.

برای مثال:

[benchmarks]
name        metafile
bench1      somedir/bm_bench1
bench2      somedir/bm_bench2
bench3      anotherdir/mybench.toml
[group default]
-bench1

این بدان معناست که به‌طور پیش‌فرض تنها "bench2" و "bench3" اجرا می‌شوند..SS ادغام مانیفست‌ها (Merging Manifests)

برای ترکیب مانیفست‌ها، از بخش [includes] در مانیفست استفاده کنید:

[includes]
project1/benchmarks/MANIFEST
project2/benchmarks/MANIFEST
<default>

توجه داشته باشید که <default> همانند گنجاندن فایل مانیفست برای بنچمارک‌های پیش‌فرض pyperformance است.

اغلب پروژه‌ها بیش از یک بنچمارک دارند که با آن‌ها به عنوان یک مجموعه رفتار می‌شود. pyperformance این موضوع را بدون نیاز به هیچ کار اضافی مدیریت می‌کند.

در دایرکتوری حاوی فایل مانیفست، همه بنچمارک‌ها را قرار دهید. سپس عبارت <local> را در ستون "metafile" بگذارید، مانند این:

[benchmarks]
name        metafile
bench1      <local>
bench2      <local>
bench3      <local>
bench4      <local>
bench5      <local>

این ابزار به دنبال DIR/bm_NAME/pyproject.toml خواهد گشت.

اگر متغیرها یا گونه‌ها (variants) نیز وجود دارند، بنچمارک اصلی را در مقدار "metafile" مشخص کنید، مانند این:

[benchmarks]
name        metafile
bench1      <local>
bench2      <local>
bench3      <local>
variant1    <local:bench3>
variant2    <local:bench3>

ابزار pyperformance به دنبال DIR/bm_BASE/bm_NAME.toml می‌گردد، که در آن "BASE" بخش پس از "local:" است.

یک پروژه پایتون می‌تواند مجموعه بنچمارک خود را با قرار دادن مسیر فایل مانیفست در بالاترین سطح فایل pyproject.toml پروژه مشخص کند. مانیفست‌های اضافی را نیز می‌توان مشخص کرد:

[tool.pyperformance]
manifest = "..."
manifests = ["...", "..."]

(یادآوری: این pyproject.toml است، نه فایل مانیفست.)

فایل فراداده یک بنچمارک (معمولاً pyproject.toml) از قالبی پیروی می‌کند که در PEP 621 https://www.python.org/dev/peps/pep-0621 و PEP 518 https://www.python.org/dev/peps/pep-0518 مشخص شده است. بنابراین دو بخش پشتیبانی‌شده در این فایل وجود دارد: "project" و "tool.pyperformance".

یک فایل فراداده معمولی شبیه به این خواهد بود:

[project]
version = "0.9.1"
dependencies = ["pyperf"]
dynamic = ["name"]
[tool.pyperformance]
name = "my_benchmark"

یک نمونه بسیار دقیق‌تر و با جزئیات بیشتر می‌تواند شبیه به این باشد:

[project]
name = "pyperformance_bm_json_dumps"
version = "0.9.1"
description = "A benchmark for json.dumps()"
requires-python = ">=3.8"
dependencies = ["pyperf"]
urls = {repository = "https://github.com/python/pyperformance"}
dynamic = ["version"]
[tool.pyperformance]
name = "json_dumps"
tags = "serialize"
runscript = "bench.py"
datadir = ".data-files/extras"
extra_opts = ["--special"]

برای اینکه یک بنچ‌مارک از دیگری (یا از متادیتای مشترک) ارث‌بری کند، فیلد "inherits" در دسترس است:

[project]
dependencies = ["pyperf"]
dynamic = ["name", "version"]
[tool.pyperformance]
name = "my_benchmark"
inherits = "../common.toml"

تمام مقادیر در هر بخش از متادیتای به ارث برده‌شده به عنوان پیش‌فرض در نظر گرفته می‌شوند که متادیتای کنونی بر روی آن‌ها اعمال می‌شود. به عنوان نمونه در مثال بالا، مقدار "version" در common.toml در اینجا استفاده خواهد شد.

اگر مقدار "inherits" یک دایرکتوری باشد (حتی برای "..")، فایل "base.toml" در آن دایرکتوری به ارث برده می‌شود.

برای variantها، فایل پایه pyproject.toml مقدار پیش‌فرض برای "inherits" است.

در برخی شرایط، مقادیر مشخص‌نشده از سایر داده‌های موجود استنتاج خواهند شد (حتی برای فیلدهای الزامی).

  • project.name <= tool.pyperformance.name
  • project.* <= متادیتای ارث‌بری‌شده (به‌جز "name" و "dynamic")
  • tool.pyperformance.name <= نام فایل متادیتا
  • tool.pyperformance.* <= متادیتای ارث‌بری‌شده (به‌جز "name" و "inherits")

هنگامی که نام از روی نام فایل برای بنچ‌مارکی با ساختار استاندارد استنتاج می‌شود، پیشوند "bm_" از دایرکتوری بنچ‌مارک حذف می‌شود. اگر یک variant باشد، این پیشوند و همچنین پسوند .toml از نام فایل متادیتا حذف می‌گردد.

فیلد نوع R T B D
project.name str X X
project.version ver X X X
project.dependencies [str] X
project.dynamic [str]

"R": الزامی (required) "T": استنتاج‌شده از بخش tool "B": استنتاج‌شده از متادیتای به ارث برده‌شده "D": برای بنچ‌مارک‌های پیش‌فرض، استنتاج‌شده از pyperformance

بر اساس PEP 621 فیلد "dynamic" زمانی الزامی است که مقداری به صورت پویا توسط ابزار پر شود. این موضوع به‌ویژه برای فیلدهای الزامی حائز اهمیت است.

تمام فیلدهای دیگر PEP 621 اختیاری هستند (مانند requires-python = ">=3.8"، {repository = "https://github.com/..."})..SS بخش [tool.pyperformance]

فیلد نوع R B F
tool.name str X X
tool.tags [str] X
tool.extra_opts [str] X
tool.inherits file
tool.runscript file X
tool.datadir file X

"R": الزامی "B": استنباط‌شده از فراداده‌های به ارث‌رسیده "F": استنباط‌شده از نام فایل

  • tags: فهرستی اختیاری از نام‌ها برای گروه‌بندی بنچمارک‌ها
  • extra_opts: فهرستی اختیاری از آرگومان‌ها برای ارسال به tool.runscript
  • runscript: اسکریپت بنچمارک برای استفاده به جای run_benchmark.py.

    این صفحه بنچمارک‌هایی را فهرست می‌کند که در CPython سریع‌تر شده‌اند.

بهینه‌سازی: افزایش 1.2 برابری سرعت فراخوانی متدها https://bugs.python.org/issue26110، کامیت f2392133 https://github.com/python/cpython/commit/f2392133eba777f05947a8996c507690b95379c3.

بنچمارک 2016-12-01 (27580c1fb5e8) 2017-01-01 (67e1aa0b58be)
call_method 14.1 ms 11.2 ms: 1.26x سریع‌تر (-21%)
call_method_slots 13.9 ms 11.1 ms: 1.25x سریع‌تر (-20%)
call_method_unknown 16.0 ms 14.3 ms: 1.12x سریع‌تر (-11%)

بهینه‌سازی: تابع PyMem_Malloc() اکنون از تخصیص‌دهنده سریع pymalloc استفاده می‌کند http://bugs.python.org/issue26249، کامیت f5c4b990 https://github.com/python/cpython/commit/f5c4b99034fae12ac2b9498dd12b5b3f352b90c8.

تغییرات دست‌کم 5%:

بنچمارک 2016-04-21 (5439fc4901db) 2016-04-22 (f5c4b99034fa)
unpickle_list 10.4 us 7.64 us: 1.36x سریع‌تر (-27%)
json_dumps 28.0 ms 25.2 ms: 1.11x سریع‌تر (-10%)
unpickle_pure_python 741 us 678 us: 1.09x سریع‌تر (-9%)
unpickle 33.9 us 31.3 us: 1.08x سریع‌تر (-8%)
meteor_contest 197 ms 183 ms: 1.08x سریع‌تر (-7%)
mako 36.9 ms 34.3 ms: 1.07x سریع‌تر (-7%)
pathlib 41.0 ms 38.4 ms: 1.07x سریع‌تر (-6%)
call_method_slots 14.8 ms 13.9 ms: 1.07x سریع‌تر (-6%)
telco 19.5 ms 18.3 ms: 1.07x سریع‌تر (-6%)
scimark_lu 413 ms 388 ms: 1.07x سریع‌تر (-6%)
nqueens 221 ms 207 ms: 1.07x سریع‌تر (-6%)
fannkuch 937 ms 882 ms: 1.06x سریع‌تر (-6%)
regex_compile 319 ms 301 ms: 1.06x سریع‌تر (-6%)
raytrace 1.16 sec 1.09 sec: 1.06x سریع‌تر (-5%)
pickle_pure_python 1.11 ms 1.05 ms: 1.05x سریع‌تر (-5%)
genshi_text 70.1 ms 66.6 ms: 1.05x سریع‌تر (-5%)
2015-12-07: بهینه‌سازی ElementTree.iterparse()، xml_etree_iterparse
بهینه‌سازی: مورد #25638: بهینه‌سازی ElementTree.iterparse()؛ اکنون ۲ برابر سریع‌تر است http://bugs.python.org/issue25638، کامیت 9ec5e25f2 https://github.com/python/cpython/commit/9ec5e25f26a490510bb5da5c26a276cd30a263a0.
box center;
l|l|l.
بنچ‌مارک 2015-12-01 (df144092a340) 2016-01-01 (71db90356390)
xml_etree_iterparse 423 ms 206 ms: 2.05 برابر سریع‌تر (-51%)

بهینه‌سازی: مورد #24915: افزودن پشتیبانی Clang به ساخت‌های PGO و استفاده از مجموعه‌آزمون برای داده‌های پروفایل http://bugs.python.org/issue24915، کامیت 7188a3ef https://github.com/python/cpython/commit/7188a3efe07b9effdb760f3a96783f250214f0be.

تغییرات دست‌کم ۵٪:

بنچ‌مارک 2015-09-18 (4b363e270108) 2015-09-18_22-13 (7188a3efe07b)
pickle 33.7 us 26.4 us: 1.28 برابر سریع‌تر (-22%)
pidigits 332 ms 286 ms: 1.16 برابر سریع‌تر (-14%)
pickle_list 9.90 us 8.84 us: 1.12 برابر سریع‌تر (-11%)
unpickle 37.2 us 33.3 us: 1.12 برابر سریع‌تر (-11%)
unpickle_list 11.1 us 9.95 us: 1.11 برابر سریع‌تر (-10%)
regex_dna 330 ms 297 ms: 1.11 برابر سریع‌تر (-10%)
regex_effbot 6.43 ms 5.80 ms: 1.11 برابر سریع‌تر (-10%)
pickle_dict 69.3 us 64.1 us: 1.08 برابر سریع‌تر (-8%)
mako 39.1 ms 36.2 ms: 1.08 برابر سریع‌تر (-7%)
call_simple 12.2 ms 11.6 ms: 1.05 برابر سریع‌تر (-5%)
genshi_xml 175 ms 166 ms: 1.05 برابر سریع‌تر (-5%)

تغییرات دست‌کم ۵٪، متأسفانه دو بنچ‌مارک نیز کندتر شدند:

بنچ‌مارک 2015-09-18_14-32-master-4b363e270108 2015-09-18_22-13-master-7188a3efe07b
unpickle_pure_python 776 us 821 us: 1.06 برابر کندتر (+6%)
regex_v8 49.5 ms 52.6 ms: 1.06 برابر کندتر (+6%)
بهینه‌سازی: گزارش #16991: افزودن پیاده‌سازی C برای collections.OrderedDict http://bugs.python.org/issue16991، کامیت 96c6af9b https://github.com/python/cpython/commit/96c6af9b207c188c52ac53ce87bb7f2dea3f328b.
box center;
l|l|l.
بنچمارک 2015-05-02 (3b4d30a27bd6) 2015-06-01 (41874c570cf3)
html5lib 285 ms 233 ms: 1.23 برابر سریع‌تر (-19%)

بهینه‌سازی: گزارش #14373: افزودن پیاده‌سازی C برای functools.lru_cache() http://bugs.python.org/issue14373، کامیت 1c858c35 https://github.com/python/cpython/commit/1c858c352b8c11419f79f586334c49378726dba8.

تغییرات دست‌کم 5%:

بنچمارک 2015-05-23_19-15-master-c70908558d8e 2015-05-23_19-42-master-1c858c352b8c
sympy_expand 1.45 ثانیه 1.14 ثانیه: 1.27 برابر سریع‌تر (-21%)
sympy_sum 308 ms 247 ms: 1.25 برابر سریع‌تر (-20%)
sympy_str 621 ms 500 ms: 1.24 برابر سریع‌تر (-19%)
sympy_integrate 54.2 ms 45.7 ms: 1.19 برابر سریع‌تر (-16%)
scimark_lu 497 ms 471 ms: 1.06 برابر سریع‌تر (-5%)

pickle_dict حدود 1.06 برابر کندتر دیده شد، اما از آنجا که pickle از functools.lru_cache() استفاده نمی‌کند، این تغییر در جدول نادیده گرفته شده است..SS افت سرعت (Slowdown)

افت سرعت: تبدیل پرچم‌های re به ثابت‌های (بسیار کاربرپسندتر) IntFlag (مورد #28082) http://bugs.python.org/issue28082، کامیت f93395bc https://github.com/python/cpython/commit/f93395bc5125c99539597bf134ca8bcf9707655b.

بنچمارک 2016-04-01 (6b6abd4cf10e) 2016-07-01 (355048970b2a) 2016-10-01 (78a111c7d867)
regex_compile 339 ms 309 ms: 1.10x سریع‌تر (-9%) 383 ms: 1.13x کندتر (+13%)

2016-04-01 .. 2016-05-01:

بنچمارک 2016-04-01 (dcfebb32e277) 2016-05-01 (f1e2671fdf88)
nqueens 255 ms 207 ms: 1.23x سریع‌تر (-19%)
raytrace 1.31 sec 1.09 sec: 1.19x سریع‌تر (-16%)
float 290 ms 243 ms: 1.19x سریع‌تر (-16%)
chaos 273 ms 235 ms: 1.16x سریع‌تر (-14%)
hexiom 21.0 ms 18.6 ms: 1.13x سریع‌تر (-11%)
deltablue 16.4 ms 14.6 ms: 1.12x سریع‌تر (-11%)
go 557 ms 502 ms: 1.11x سریع‌تر (-10%)
nbody 254 ms 232 ms: 1.10x سریع‌تر (-9%)
خط زمانی 2016-04-01 .. 2017-01-01:
box center;
l|l|l|l|l.
بنچ‌مارک 2016-04-01 (6b6abd4cf10e) 2016-07-01 (355048970b2a)
2016-10-01 (78a111c7d867)
T} 2017-01-01 (67e1aa0b58be)
call_method 15.8 ms 14.9 ms: 1.06 برابر سریع‌تر (-6%)
14.1 ms: 1.13 برابر سریع‌تر (-11%)
T} 11.2 ms: 1.42 برابر سریع‌تر (-29%)
call_method_slots 15.7 ms 15.2 ms: 1.03 برابر سریع‌تر (-3%)
14.0 ms: 1.13 برابر سریع‌تر (-11%)
T} 11.1 ms: 1.42 برابر سریع‌تر (-29%)
call_method_unknown 17.7 ms 15.9 ms: 1.11 برابر سریع‌تر (-10%)
15.6 ms: 1.13 برابر سریع‌تر (-11%)
T} 14.3 ms: 1.23 برابر سریع‌تر (-19%)

بنچ‌مارک 2016-04-01 (master) 2016-05-01 (master)
crypto_pyaes 226 ms 205 ms: 1.10 برابر سریع‌تر (-9%)

2016-03-01 .. 2016-06-01:

بنچ‌مارک 2016-03-01 (13d09afff127) 2016-06-01 (d80ab7d94578)
crypto_pyaes 231 ms 199 ms: 1.16 برابر سریع‌تر (-14%)
پیشرفت طی ۲۱ ماه، 2015-01-01 .. 2016-10-01:
box center;
l|l|l.
بنچمارک 2015-01-01 (52074ac866eb) 2016-10-01 (78a111c7d867)
json_loads 64.0 us 56.6 us: 1.13 برابر سریع‌تر (-11%)

بنچمارک 2016-01-01 (899b72cee21c) 2016-07-01 (355048970b2a)
logging_silent 718 ns 606 ns: 1.18 برابر سریع‌تر (-16%)

pickle،‏ 2016-08-02 .. 2016-09-08:

بنچمارک 2016-08-02 (133138a284be) 2016-09-08 (10427f44852b)
pickle 25.5 us 21.4 us: 1.19 برابر سریع‌تر (-16%)

pickle روی dict/list:

بنچمارک 2016-04-01 (6b6abd4cf10e) 2016-10-01 (78a111c7d867)
pickle_dict 64.5 us 57.7 us: 1.12 برابر سریع‌تر (-11%)
pickle_list 9.06 us 7.79 us: 1.16 برابر سریع‌تر (-14%)

unpickle:

بنچمارک 2015-07-01 (d7982beca93c) 2015-10-01 (30b7138fe12b)
unpickle 36.9 us 32.8 us: 1.13 برابر سریع‌تر (-11%)
2015-04-01 .. 2015-10-01:
box center;
l|l|l.
بنچمارک 2015-04-01 (4fd929b43121) 2015-10-01 (30b7138fe12b)
python_startup 16.4 ms 17.2 ms: 1.05 برابر کندتر (+5%)
python_startup_no_site 8.65 ms 8.90 ms: 1.03 برابر کندتر (+3%)

2016-04-01 .. 2017-01-01:

بنچمارک 2016-04-01 (6b6abd4cf10e) 2017-01-01 (67e1aa0b58be)
python_startup 17.3 ms 14.5 ms: 1.20 برابر سریع‌تر (-16%)
python_startup_no_site 8.89 ms 8.39 ms: 1.06 برابر سریع‌تر (-6%)

بنچمارک 2016-04-01 (6b6abd4cf10e) 2016-07-01 (355048970b2a) 2016-10-01 (78a111c7d867)
regex_compile 339 ms 309 ms: 1.10 برابر سریع‌تر (-9%) 383 ms: 1.13 برابر کندتر (+13%)
box center;
l|l|l|l|l|l.
بنچمارک 2016-01-01 (899b72cee21c) 2016-04-01 (6b6abd4cf10e) 2016-07-01 (355048970b2a)
2016-10-01 (78a111c7d867)
T} 2017-03-31 (cdcac039fb44)
telco 19.6 ms 19.2 ms: 1.02x سریع‌تر (-2%) 18.3 ms: 1.08x سریع‌تر (-7%)
15.1 ms: 1.30x سریع‌تر (-23%)
T} 13.9 ms: 1.41x سریع‌تر (-29%)

2016-10-01 .. 2017-03-31:

بنچمارک 2016-10-01 (78a111c7d867) 2017-01-01 (67e1aa0b58be) 2017-03-31 (cdcac039fb44)
scimark_lu 423 ms 378 ms: 1.12x سریع‌تر (-11%) 318 ms: 1.33x سریع‌تر (-25%)
scimark_sor 426 ms 403 ms: 1.06x سریع‌تر (-5%) 375 ms: 1.14x سریع‌تر (-12%)

بنچمارک 2014-10-01 (5a789f7eaf81) 2015-10-01 (30b7138fe12b)
sqlalchemy_declarative 345 ms 301 ms: 1.15x سریع‌تر (-13%)
2016-04-01 .. 2016-10-01:
box center;
l|l|l|l.
معیارسنجی 2016-04-01 (6b6abd4cf10e) 2016-07-01 (355048970b2a)
2016-10-01 (78a111c7d867)
T}
sympy_expand 1.10 ثانیه 1.01 ثانیه: 1.09 برابر سریع‌تر (-8%)
942 میلی‌ثانیه: 1.17 برابر سریع‌تر (-14%)
T}
sympy_integrate 46.6 میلی‌ثانیه 42.9 میلی‌ثانیه: 1.09 برابر سریع‌تر (-8%)
41.2 میلی‌ثانیه: 1.13 برابر سریع‌تر (-11%)
T}
sympy_sum 247 میلی‌ثانیه 233 میلی‌ثانیه: 1.06 برابر سریع‌تر (-6%)
199 میلی‌ثانیه: 1.24 برابر سریع‌تر (-19%)
T}
sympy_str 483 میلی‌ثانیه 454 میلی‌ثانیه: 1.07 برابر سریع‌تر (-6%)
427 میلی‌ثانیه: 1.13 برابر سریع‌تر (-12%)
T}

معیارسنجی 2015-04-01 (4fd929b43121) 2015-07-01 (d7982beca93c) 2015-10-01 (30b7138fe12b) 2016-01-01 (899b72cee21c) 2016-07-01 (355048970b2a)
xml_etree_generate 282 میلی‌ثانیه 267 میلی‌ثانیه: 1.06 برابر سریع‌تر (-5%) 256 میلی‌ثانیه: 1.10 برابر سریع‌تر (-9%) 237 میلی‌ثانیه: 1.19 برابر سریع‌تر (-16%) 212 میلی‌ثانیه: 1.33 برابر سریع‌تر (-25%)
"تغییرات (CHANGELOG)"
"نسخه 1.14.0"
0.0
• 2
ارتقای pyperf به 2.10.0
• 2
افزودن بنچمارک ماژول base64 (شامل b64، b32، b16، a85، b85)
• 2
افزودن بنچمارک FastAPI HTTP
• 2
افزودن بنچمارک تجزیه YAML
• 2
رعایت تنظیم rigorous در فایل‌های پیکربندی بنچمارک
168u
"نسخه 1.13.0 (2025-10-27)"
0.0
• 2
فعال‌سازی مجدد بنچمارک xdsl
• 2
حذف کد مربوط به Python 3.7 و نسخه‌های پیشین
• 2
به‌روزرسانی‌های CI:
* رفع اشکال گردش‌کار ubuntu-latest
* حذف پیکربندی استفاده‌نشده Azure Pipelines
* به‌روزرسانی نسخه checkout
* راه‌اندازی dependabot
* به‌روزرسانی نسخه setup-python
168u
"نسخه 1.12.0 (2025-10-24)"
0.0
• 2
افزودن بنچمارک xdsl (اما به‌دلیل یک رگرسیون، به‌صورت پیش‌فرض غیرفعال است)
• 2
افزودن شبیه‌سازی nbody جدید با quadtree با استفاده از الگوریتم Barnes Hut
• 2
افزودن بنچمارک argparse
• 2
افزودن بنچمارک‌های NetworkX
• 2
افزودن بنچمارک Sphinx
• 2
افزودن بنچمارک ماژول decimal
• 2
افزودن بنچمارک توکنایزر BPE
• 2
صرف‌نظر از بنچمارک dask در Windows برای Python 3.13
• 2
ارتقای dask[distributed] به 2024.10.1 جهت سازگاری با Windows
• 2
ارتقای greenlet به 3.2.4 جهت سازگاری با +3.13
• 2
ارتقای Chameleon به 4.6.0
• 2
ارتقای tornado به 6.5.0
• 2
ارتقای pyperf به 2.9.0
• 2
ارتقای sqlglot به V2
• 2
ارتقای mypy به 1.18.2
• 2
رفع اشکال در بررسی حالت editable
• 2
رفع اشکال مدیریت --same-loops
• 2
رفع اشکال: ارسال پرچم‌های --warmup و --timeout به pyperf
• 2
افزودن آرگومان خط فرمانی -V/--version
• 2
افزودن آرگومان خط فرمانی --hook
• 2
اجرای قالب‌بندی و بررسی ruff تحت pre-commit و GitHub Actions
• 2
افزودن پشتیبانی از ساخت‌های آزمایشی JIT
• 2
افزودن CI برای Arm64
• 2
افزودن CI برای Free-threading
• 2
تبدیل Windows به پلتفرم غیرازمایشی در CI
• 2
افزودن پشتیبانی از Python 3.14 و حذف پشتیبانی از Python 3.7، 3.8، 3.9
0.0
• 2
افزودن گزینهٔ --same-loops به دستور run برای استفاده از دقیقاً همان تعداد
حلقه‌های اجرای پیشین (بدون کالیبراسیون مجدد).
• 2
ارتقای pyperf به 2.6.3
• 2
اصلاح بنچمارک django_template جهت سازگاری با 3.13
• 2
اصلاح benchmark.conf.sample
168u
نسخه 1.10.0 (2023-10-22)
0.0
• 2
افزودن بنچمارک برای asyncio_webockets
• 2
ارائهٔ گزینهٔ --min-time از pyperf در رابط خط فرمان (CLI) ابزار pyperformance
• 2
ارتقای coverage به 7.3.2 جهت سازگاری با 3.13
• 2
ارتقای greenlet به 3.0.0rc3 جهت سازگاری با 3.13
168u
نسخه 1.0.9 (2023-06-14)
0.0
• 2
گنجاندن مستقیم (Vendor) بستهٔ lib2to3 برای Python 3.13+
• 2
افزودن گونه‌های TaskGroups به بنچمارک‌های async_tree
168u
نسخه 1.0.8 (2023-06-02)
0.0
• 2
انتقال فایل اصلی requirements.txt به pyperformance/requirements
تا dependabot تنها روی همان یک فایل اجرا شود
• 2
به‌روزرسانی وابستگی‌های بنچمارک‌ها جهت عدم تعیین setuptools
• 2
در نسخه‌های قدیمی‌تر Python، نادیده گرفتن بنچمارک‌هایی که از قابلیت‌های
معرفی‌شده در نسخه‌های جدیدتر Python استفاده می‌کنند
• 2
پشتیبانی از --inherit-environ هنگام استفادهٔ مجدد از یک venv
• 2
استفاده از tomllib/tomli به جای toml
• 2
به‌روزرسانی MANIFEST.in جهت گنجاندن فایل‌های گواهی برای بنچمارک asyncio_tcp_ssl
• 2
رفع مشکل متغیر تعریف‌نشده هنگام ایجاد خطای VenvPipInstallFailedError
• 2
افزودن پیکربندی mypy؛ اجرای mypy در CI
• 2
اصلاح غلط املایی str.partition در _pyproject_toml.py
• 2
افزودن نسخه‌ای از بنچمارک Richards که از super() استفاده می‌کند
• 2
افزودن یک بنچمارک برای پروتکل‌های runtime-checkable
• 2
گسترش بنچمارک‌های async tree جهت پوشش اجرای مشتاقانهٔ (eager) وظایف
168u
نسخه 1.0.7 (2023-04-22)
0.0
• 2
ارتقای pyperf از 2.5.0 به 2.6.0
• 2
پاک‌سازی importهای بدون استفاده و سایر جزئیات کوچک کد
• 2
مهاجرت به پروژهٔ مبتنی بر pyproject.toml
• 2
اصلاح بنچمارک django_template به دلیل عدم وجود distutils
• 2
افزودن بنچمارک برای toml
• 2
افزودن بنچمارک برای comprehensions
• 2
افزودن بنچمارک برای asyncio_tcp_ssl
• 2
افزودن بنچمارک برای asyncio_tcp
• 2
افزودن بنچمارک برای زمان‌بند Dask
• 2
افزودن بنچمارک‌های gc به فایل MANIFEST
0.0
• 2
ارتقای pyperf از 2.4.1 به 2.5.0
• 2
افزودن یک بنچمارک برای اندازه‌گیری پیمایش gc
• 2
افزودن فیلد jobs در بخش compile جهت تعیین پارامتر make -j
• 2
افزودن بنچمارک برای Docutils
• 2
افزودن بنچمارک async_generators
• 2
افزودن بنچمارک برای IPC
• 2
رفع اشکال Manifest Group
• 2
رفع اشکال نصب بیلد توسعه pyperformance درون compile/compile_all
• 2
بارگذاری نتایج در هر حالت، حتی در صورت شکست برخی از بنچمارک‌ها
• 2
افزودن بنچمارک‌های sqlglot
• 2
پشتیبانی از گزارش میانگین هندسی بر اساس برچسب‌ها (tags)
• 2
امکان تعیین فایل‌های محلی wheel و sdist به عنوان وابستگی
• 2
افزودن یک بنچمارک بر پایه python -m pprint
• 2
بازگرداندن mdp به گروه پیش‌فرض
• 2
افزودن بنچمارک coroutines
• 2
کاهش نویز در بنچمارک generators
• 2
افزودن بنچمارک برای deepcopy
• 2
افزودن بنچمارک coverage
• 2
افزودن بنچمارک generators
• 2
افزودن بنچمارک برای بارهای کاری درخت ناهمگام (async tree)
• 2
پشتیبانی از مسیرهای نسبی به فایل‌های manifest
• 2
افزودن پشتیبانی از چندین گروه بنچمارک در یک manifest
• 2
رفع اشکال --inherit-environ
• 2
استفاده از نسخه فعال Genshi 0.7.7
168u
نسخه 1.0.4 (2022-01-25)
0.0
• 2
انتشار مجدد پشتیبانی از بنچمارک تعریف‌شده توسط کاربر پس از رفع اشکال در محیط‌های مجازی.
168u
نسخه 1.0.3 (2021-12-20)
0.0
• 2
پشتیبانی از مجموعه‌های بنچمارک تعریف‌شده توسط کاربر.
168u
نسخه 1.0.2 (2021-05-11)
0.0
• 2
غیرفعال‌سازی موقت بنچمارک henshi به دلیل عدم سازگاری با Python 3.11.
• 2
فعال‌سازی مجدد بنچمارک html5lib: نسخه 1.1 html5lib منتشر شده است.
• 2
به‌روزرسانی پیش‌نیازها.
• 2
جایگزینی Travis CI با GitHub Actions.
• 2
شاخه توسعه master به main تغییر نام داد.
برای بررسی دلایل، به https://sfconservancy.org/news/2020/jun/23/gitbranchname مراجعه کنید.
168u
نسخه 1.0.1 (2020-03-26)
0.0
• 2
حذف استفاده از ماژول six با توجه به توقف پشتیبانی از Python 2.
حذف کدهای مختص به Python 2.
• 2
به‌روزرسانی وابستگی‌ها:
2.0
• 2
django: 3.0 => 3.0.4
• 2
dulwich: 0.19.14 => 0.19.15
• 2
mako: 1.1.0 = > 1.1.2
• 2
mercurial: 5.1.1 => 5.3.1
• 2
psutil: 5.6.7 => 5.7.0
• 2
pyperf: 1.7.0 => 2.0.0
• 2
sqlalchemy: 1.3.12 => 1.3.15
• 2
sympy: 1.5 => 1.5.1
• 2
tornado: 6.0.3 => 6.0.4
168u
• 2
حذف پیش‌نیازهای six ،html5lib و mercurial.
• 2
اکنون از pip-tools (pip-compile) برای به‌روزرسانی وابستگی‌ها استفاده می‌شود
0.0
• 2
فعال‌سازی بنچ‌مارک‌های pyflate در Python 3.
• 2
حذف بنچ‌مارک spambayes: با Python 3 سازگار نیست.
• 2
حذف گروه بنچ‌مارک 2n3.
• 2
قطع پشتیبانی از Python 2.7: نسخه‌های قدیمی Django و Tornado با
Python 3.9 پیش‌رو سازگار نیستند.
• 2
غیرفعال‌سازی موقت بنچ‌مارک html5lib، زیرا دیگر با
Python 3.9 سازگار نیست.
• 2
به‌روزرسانی نیازمندی‌ها:
2.0
• 2
Django: 1.11.22 => 3.0
• 2
Mako: 1.0.14 => 1.1.0
• 2
SQLAlchemy: 1.3.6 => 1.3.12
• 2
certifi: 2019.6.16 => 2019.11.28
• 2
docutils: 0.15.1 => 0.15.2
• 2
dulwich: 0.19.11 => 0.19.14
• 2
mercurial: 5.0.2 => 5.1.1
• 2
psutil: 5.6. => 5.6.7
• 2
pyperf: 1.6.1 => 1.7.0
• 2
six: 1.12. => 1.13.0
• 2
sympy: 1.4 => 1.5
168u
168u
نسخه 0.9.1 (2019-07-29)
0.0
• 2
فعال‌سازی hg_startup در Python 3
• 2
رفع مشکل سازگاری با Python 3.8 beta 2
• 2
به‌روزرسانی نیازمندی‌ها:
2.0
• 2
certifi: 2019.3.9 => 2019.6.16
• 2
Chameleon: 3.6.1 => 3.6.2
• 2
Django: 1.11.20 => 1.11.22
• 2
docutils: 0.14 => 0.15.1.post1
• 2
Mako: 1.0.10 => 1.0.14
• 2
mercurial: 5.0 => 5.0.2
• 2
pathlib2: 2.3.3 => 2.3.4
• 2
psutil: 5.6.2 => 5.6.3
• 2
SQLAlchemy: 1.3.4 => 1.3.6
168u
168u
نسخه 0.9.0 (2019-05-29)
0.0
• 2
تغییر نام پروژه از "performance" به "pyperformance"
• 2
ارتقای pyperf از نسخه 1.6.0 به 1.6.1. پروژه از
"perf" به "pyperf" تغییر نام یافته است. به‌روزرسانی importها.
• 2
گزارش #54: به‌روزرسانی Genshi به 0.7.3. اکنون با Python 3.8 سازگار است.
• 2
به‌روزرسانی نیازمندی‌ها:
2.0
• 2
Mako: 1.0.9= > 1.0.10
• 2
SQLAlchemy: 1.3.3 => 1.3.4
168u
0.0
• 2
دستور compile: افزودن گزینه "pkg_only" به benchmark.conf.
افزودن پشتیبانی از کتابخانه‌های بومی که نصب شده‌اند اما در path قرار ندارند.
وصله توسط Robert Grimm.
• 2
به‌روزرسانی پیکربندی Travis: استفاده از تصویر trusty، استفاده از کَش pip.
وصله توسط Inada Naoki.
• 2
ارتقای tornado به 5.1.1.
وصله توسط Inada Naoki.
• 2
رفع اشکال دستور compile در Mac OS: عدم وجود پسوند برنامه. وصله توسط Anthony Shaw.
• 2
به‌روزرسانی نیازمندی‌ها:
2.0
• 2
Chameleon: 3.4 => 3.6.1
• 2
Django: 1.11.16 => 1.11.20
• 2
Genshi: 0.7.1 => 0.7.2
• 2
Mako: 1.0.7 => 1.0.9
• 2
MarkupSafe: 1.0 => 1.1.1
• 2
SQLAlchemy: 1.2.12 => 1.3.3
• 2
certifi: 2018.10.15 => 2019.3.9
• 2
dulwich: 0.19.6 => 0.19.11
• 2
mercurial: 4.7.2 => 5.0
• 2
mpmath: 1.0.0 => 1.1.0
• 2
pathlib2: 2.3.2 => 2.3.3
• 2
perf: 1.5.1 => 1.6.0
• 2
psutil: 5.4.7 => 5.6.2
• 2
six: 1.11.0 => 1.12.0
• 2
sympy: 1.3 => 1.4
• 2
tornado: 4.5.3 => 5.1.1
168u
168u
نسخه 0.7.0 (2018-10-16)
0.0
• 2
python_startup: افزودن گزینه --exit.
• 2
به‌روزرسانی نیازمندی‌ها:
2.0
• 2
certifi: 2017.11.5 => 2018.10.15
• 2
Chameleon: 3.2 => 3.4
• 2
Django: 1.11.9 => 1.11.16
• 2
dulwich: 0.18.6 => 0.19.6
• 2
Genshi: 0.7 => 0.7.1
• 2
mercurial: 4.4.2 => 4.7.2
• 2
pathlib2: 2.3.0 => 2.3.2
• 2
psutil: 5.4.3 => 5.4.7
• 2
SQLAlchemy: 1.2.0 => 1.2.12
• 2
sympy: 1.1.1 => 1.3
168u
• 2
رفع اشکال #40 برای pip 10 و جدیدتر: حذف وابستگی‌های غیرمستقیم. از وابستگی‌های
غیرمستقیم برای نصب cffi استفاده می‌شد، اما Mercurial 4.0 دیگر به
cffi وابسته نیست.
0.0
• 2
رفع مشکل inherit-environ: انتشار به فراخوانی‌های بازگشتی performance
در دستورهای compile و compile_all.
• 2
رفع باگ گزینهٔ --track-memory به لطف به‌روزرسانی به perf 1.5.
• 2
به‌روزرسانی پیش‌نیازها
2.0
• 2
certifi: 2017.4.17 => 2017.11.5
• 2
Chameleon: 3.1 => 3.2
• 2
Django: 1.11.3 => 1.11.9
• 2
docutils: 0.13.1 => 0.14
• 2
dulwich: 0.17.3 => 0.18.6
• 2
html5lib: 0.999999999 => 1.0.1
• 2
Mako: 1.0.6 => 1.0.7
• 2
mercurial: 4.2.2 => 4.4.2
• 2
mpmath: 0.19 => 1.0.0
• 2
perf: 1.4 => 1.5.1 (رفع مشکل گزینهٔ --track-memory)
• 2
psutil: 5.2.2 => 5.4.3
• 2
pyaes: 1.6.0 => 1.6.1
• 2
six: 1.10.0 => 1.11.0
• 2
SQLAlchemy: 1.1.11 => 1.2.0
• 2
sympy: 1.0 => 1.1.1
• 2
tornado: 4.5.1 => 4.5.3
168u
168u
نسخه 0.6.0 (2017-07-06)
0.0
• 2
تغییر warn به warning در bm_logging.py. در Python 3، متد Logger.warn()
برای ثبت هشدار منسوخ‌شدگی، warnings.warn() را فراخوانی می‌کند، بنابراین نسبت به
Logger.warning() کندتر است.
• 2
افزودن دوبارهٔ مجموعه ریزبنچ‌مارک‌های logging_silent.
• 2
دستور compile: به‌روزرسانی مخزن Git پیش از دریافت revision.
• 2
به‌روزرسانی پیش‌نیازها
2.0
• 2
perf: 1.3 => 1.4 (رفع مشکل parse_cpu_list(): حذف نویسه‌های NUL نیز انجام می‌شود)
• 2
Django: 1.11.1 => 1.11.3
• 2
mercurial: 4.2 => 4.2.2
• 2
pathlib2: 2.2.1 => 2.3.0
• 2
SQLAlchemy: 1.1.10 => 1.1.11
168u
168u
نسخه 0.5.5 (2017-05-29)
0.0
• 2
در شاخهٔ 2.x در CPython، اکنون compile گزینهٔ --enable-unicode=ucs4 را روی
تمام پلتفرم‌ها به اسکریپت configure ارسال می‌کند، به جز در Windows که به دلیل
wchar_t شانزده بیتی از UTF-16 استفاده می‌کند.
• 2
بنچ‌مارک float اکنون از __slots__ در کلاس Point استفاده می‌کند.
• 2
حذف ریزبنچ‌مارک‌های زیر. آن‌ها به پروژهٔ pymicrobench https://github.com/vstinner/pymicrobench
منتقل شده‌اند زیرا بسیار کوتاه‌اند، نمایندهٔ برنامه‌های واقعی نیستند و بیش از حد
ناپایدارند.
2.0
• 2
مجموعه ریزبنچ‌مارک pybench
• 2
call_simple
• 2
call_method
• 2
call_method_unknown
• 2
call_method_slots
• 2
logging_silent: مقادیر در PyPy با 2^27 حلقه سریع‌تر از 1 ns هستند!
(و حدود 0.7 us در CPython)
168u
• 2
به‌روزرسانی پیش‌نیازها
2.0
• 2
Django: 1.11 => 1.11.1
• 2
SQLAlchemy: 1.1.9 => 1.1.10
• 2
certifi: 2017.1.23 => 2017.4.17
• 2
perf: 1.2 => 1.3
• 2
mercurial: 4.1.2 => 4.2
• 2
tornado: 4.4.3 => 4.5.1
168u
0.0
• 2
ایجاد مستندات جدید در: http://pyperformance.readthedocs.io
• 2
افزودن "CPython results, 2017" به مستندات: تغییرات عملکردی چشمگیر، بهینه‌سازی‌های قابل‌توجه، خط زمانی، و غیره.
• 2
دستور show دیگر نیازی به ساخت یک virtual env ندارد.
• 2
افزودن دستورهای جدید:
2.0
• 2
pyperformance compile: کامپایل، نصب و اجرای بنچمارک
• 2
pyperformance compile_all: اجرای بنچمارک روی شاخه‌ها و بازبینی‌های (revisions) متعدد Python
• 2
pyperformance upload: بارگذاری یک فایل JSON در Codespeed
168u
• 2
setup.py: افزودن وابستگی‌ها به ماژول‌های perf و six.
• 2
اکنون bm_xml_etree در صورت غیرفعال بودن صریح شتاب‌دهنده، از "_pure_python" در نام‌های بنچمارک استفاده می‌کند.
• 2
ارتقای پیش‌نیازها:
2.0
• 2
Django: 1.10.6 -> 1.11
• 2
SQLAlchemy: 1.1.6 -> 1.1.9
• 2
mercurial: 4.1.1 -> 4.1.2
• 2
perf: 1.1 => 1.2
• 2
psutil: 5.2.1 -> 5.2.2
• 2
tornado: 4.4.2 -> 4.4.3
• 2
webencodings: 0.5 -> 0.5.1
168u
• 2
ابزار perf 1.2 اکنون تعداد مراحل آماده‌سازی اولیه (warmups) را روی PyPy کالیبره می‌کند.
• 2
در Python 3.5a0: اجبار به استفاده از pip 7.1.2 و setuptools 18.5:
https://sourceforge.net/p/pyparsing/bugs/100
168u
"نسخه 0.5.3 (2017-03-27)"
0.0
• 2
ارتقای Dulwich به 0.17.3 برای پشتیبانی از نسخه‌های PyPy قدیمی‌تر از 5.6:
ببینید: https://github.com/jelmer/dulwich/issues/509
• 2
رفع هشدارهای ResourceWarning: بستن صریح فایل‌ها و سوکت‌ها.
• 2
اسکریپت‌ها: جایگزینی دستورهای Mercurial با دستورهای Git.
• 2
ارتقای پیش‌نیازها:
2.0
• 2
dulwich: 0.17.1 => 0.17.3
• 2
perf: 1.0 => 1.1
• 2
psutil: 5.2.0 => 5.2.1
168u
168u
"نسخه 0.5.2 (2017-03-17)"
0.0
• 2
ارتقای پیش‌نیازها:
2.0
• 2
certifi: 2016.9.26 => 2017.1.23
• 2
Chameleon: 3.0 => 3.1
• 2
Django: 1.10.5 => 1.10.6
• 2
MarkupSafe: 0.23 => 1.0
• 2
dulwich: 0.16.3 => 0.17.1
• 2
mercurial: 4.0.2 => 4.1.1
• 2
pathlib2: 2.2.0 => 2.2.1
• 2
perf: 0.9.3 => 1.0
• 2
psutil: 5.0.1 => 5.2.0
• 2
SQLAlchemy: 1.1.4 => 1.1.6
168u
0.0
• 2
اصلاح پشتیبانی از Windows (ارتقای perf از 0.9.0 به 0.9.3)
• 2
ارتقای نیازمندی‌ها:
2.0
• 2
Chameleon: 2.25 => 3.0
• 2
Django: 1.10.3 => 1.10.5
• 2
docutils: 0.12 => 0.13.1
• 2
dulwich: 0.15.0 => 0.16.3
• 2
mercurial: 4.0.0 => 4.0.2
• 2
perf: 0.9.0 => 0.9.3
• 2
psutil: 5.0.0 => 5.0.1
168u
168u
نسخه 0.5.0 (2016-11-16)
0.0
• 2
افزودن بنچ‌مارک mdp: نبرد با خسارات و مرتب‌سازی توپولوژیکی گره‌ها
در یک گراف
• 2
گروه بنچ‌مارک default اکنون شامل تمام بنچ‌مارک‌ها به‌جز pybench است
• 2
در صورت شکست یک بنچ‌مارک، خطا ثبت شده، اجرای بنچ‌مارک‌های بعدی
ادامه می‌یابد، اما با کد خطای 1 خارج می‌شود.
• 2
حذف بنچ‌مارک‌های منسوخ‌شده: threading_threaded_count و
threading_iterative_count. به‌هر‌حال امکان اجرای آن‌ها وجود نداشت.
• 2
نیازمندی dulwich اکنون اختیاری است زیرا نصب آن روی Windows با شکست مواجه می‌شود.
• 2
ارتقای نیازمندی‌ها:
2.0
• 2
Mako: 1.0.5 => 1.0.6
• 2
Mercurial: 3.9.2 => 4.0.0
• 2
SQLAlchemy: 1.1.3 => 1.1.4
• 2
backports-abc: 0.4 => 0.5
168u
168u
نسخه 0.4.0 (2016-11-07)
0.0
• 2
افزودن بنچ‌مارک sqlalchemy_imperative: به‌درستی ثبت نشده بود
• 2
دستور list اکنون تنها بنچ‌مارک‌هایی را فهرست می‌کند که دستور run
اجرا خواهد کرد. دستور list یک گزینه جدید -b/--benchmarks دریافت می‌کند.
• 2
بازنویسی کدی که محیط مجازی را ایجاد می‌کند تا pip را به‌درستی بیازماید.
دانلود و اجرای get-pip.py در صورت ناموفق بودن نصب pip.
• 2
ارتقای نیازمندی‌ها:
2.0
• 2
perf: 0.8.2 => 0.9.0
• 2
Django: 1.10.2 => 1.10.3
• 2
Mako: 1.0.4 => 1.0.5
• 2
psutil: 4.3.1 => 5.0.0
• 2
SQLAlchemy: 1.1.2 => 1.1.3
168u
• 2
حذف وابستگی virtualenv
168u
نسخه 0.3.2 (2016-10-19)
0.0
• 2
اصلاح setup.py: گنجاندن performance/benchmarks/data/asyncio.git/ نیز
0.0
• 2
افزودن بنچمارک regex_dna
• 2
دستور run اکنون در صورتی که هیچ بنچمارکی اجرا نشود با خطا متوقف می‌شود.
• 2
اسکریپت‌های genshi، logging، scimark، sympy و xml_etree اکنون به‌طور پیش‌فرض تمام زیر-بنچمارک‌ها را اجرا می‌کنند
• 2
بازنویسی pybench با استفاده از perf: حذف کدهای قدیمی و موروثی برای کالیبره‌سازی و اجرای بنچمارک‌ها، استفاده مجدد از API مربوط به perf.Runner.
• 2
تغییر روش ابتکاری (heuristic) برای ساخت محیط مجازی؛ دستورهای بررسی‌شده:
2.0
• 2
python -m venv
• 2
python -m virtualenv
• 2
virtualenv -p python
168u
• 2
فرآیند ساخت محیط مجازی اکنون برای شناسایی "python3 -m venv"; که pip را نصب نمی‌کند، از کارکرد صحیح pip اطمینان حاصل می‌کند.
• 2
ارتقای وابستگی perf از 0.7.12 به 0.8.2: به‌روزرسانی تمام بنچمارک‌ها به رابط برنامه‌نویسی (API) جدید perf 0.8 (که تغییرات ناسازگاری به همراه دارد)
• 2
به‌روزرسانی SQLAlchemy از 1.1.1 به 1.1.2
168u
"نسخه 0.3.0 (2016-10-11)"
بنچمارک‌های جدید:
0.0
• 2
افزودن crypto_pyaes: بنچمارک پیاده‌سازی پایتون خالص از رمز قالبی AES در حالت CTR با استفاده از ماژول pyaes (نسخه 1.6.0). افزودن وابستگی pyaes.
• 2
افزودن sympy: بنچمارک روی SymPy. افزودن وابستگی scipy.
• 2
افزودن بنچمارک scimark
• 2
افزودن deltablue: بنچمارک DeltaBlue
• 2
افزودن dulwich_log: پیمایش روی کامیت‌های مخزن گیت asyncio با استفاده از ماژول Dulwich. افزودن وابستگی‌های dulwich (و mpmath).
• 2
افزودن pyflate: بنچمارک Pyflate، بازکننده فشرده‌سازی tar/bzip2 در پایتون خالص
• 2
افزودن بنچمارک sqlite_synth: بنچمارک توابع تجمیعی پایتون برای SQLite
• 2
افزودن بنچمارک genshi: رندر قالب به XML یا متن ساده با استفاده از ماژول Genshi. افزودن وابستگی Genshi.
• 2
افزودن بنچمارک‌های sqlalchemy_declarative و sqlalchemy_imperative: بنچمارک‌های Declarative و Imperative در SQLAlchemy با استفاده از SQLite. افزودن وابستگی SQLAlchemy.
168u
بهبودها:
0.0
• 2
دستور compare اکنون در صورت تفاوت در نسخه‌های performance با خطا مواجه می‌شود
• 2
nbody: افزودن گزینه‌های خط فرمان --reference و --iterations.
• 2
chaos: افزودن گزینه‌های خط فرمان --width، --height، --thickness، --filename و --rng-seed
• 2
django_template: افزودن گزینه خط فرمان --table-size
• 2
json_dumps: افزودن گزینه خط فرمان --cases
• 2
pidigits: افزودن گزینه خط فرمان --digits
• 2
raytrace: افزودن گزینه‌های خط فرمان --width، --height و --filename
• 2
پورت کردن بنچمارک html5lib به Python 3
• 2
فعال‌سازی pickle_pure_python و unpickle_pure_python روی Python 3 (کد از پیش با Python 3 سازگار بود)
• 2
ساخت محیط مجازی دیگر به‌طور پیش‌فرض متغیرهای محیطی (به‌ویژه PYTHONPATH) را به ارث نمی‌برد: اکنون باید صریحاً از گزینه خط فرمان --inherit-environ استفاده شود.
168u
رفع باگ‌ها:
0.0
• 2
بنچمارک chaos اکنون در هر نمونه، ماژول random را نیز بازنشانی می‌کند تا نتایج بنچمارک تکرارپذیرتر باشند
• 2
بنچمارک‌های Logging اکنون پیش از هر اجرای بنچمارک، جریان درون‌حافظه‌ای را کوتاه (truncate) می‌کنند
168u
تغییر نام بنچمارک‌ها:
0.0
• 2
تغییر نام بنچمارک‌ها برای دستیابی به نامی یکپارچه میان خط فرمان و نام بنچمارک در فایل JSON.
• 2
تغییر نام بنچمارک‌های pickle:
2.0
3.5
0.0
• 2
slowpickle به pickle_pure_python تبدیل شد
• 2
slowunpickle به unpickle_pure_python تبدیل شد
• 2
fastpickle به pickle تبدیل شد
• 2
fastunpickle به unpickle تبدیل شد
168u
168u
168u
168u
0.0
3.5
0.0
• 2
تغییر نام بنچمارک‌های ElementTree: جایگزینی پیشوند etree_ با xml_etree_.
• 2
تغییر نام hexiom2 به hexiom_level25 و ارسال صریح پارامتر --level=25
• 2
تغییر نام json_load به json_loads
• 2
تغییر نام json_dump_v2 به json_dumps (و حذف بنچمارک منسوخ‌شده json_dump)
• 2
تغییر نام normal_startup به python_startup، و startup_nosite به python_startup_no_site
• 2
تغییر نام threaded_count به threading_threaded_count، تغییر نام iterative_count به threading_iterative_count
• 2
تغییر نام بنچمارک‌های logging:
2.0
• 2
silent_logging به logging_silent
• 2
simple_logging به logging_simple
• 2
formatted_logging به logging_format
168u
168u
168u
168u
تغییرات جزئی:
0.0
• 2
به‌روزرسانی وابستگی‌ها
• 2
حذف گزینه خط فرمان خراب --args.
0.0
• 2
افزودن دستور جدید show برای نمایش یک فایل بنچ‌مارک
• 2
مسئلهٔ #11: نمایش نسخهٔ Python در compare. همچنین نمایش نسخهٔ performance.
• 2
مسئلهٔ CPython شماره #26383؛ خروجی csv: ارقام برای زمان‌بندی‌های کوتاه‌تر از 1 us بریده نمی‌شوند
• 2
دستور compare: استفاده از واحد نمونه‌های بنچ‌مارک، قالب‌بندی مقادیر در جدول خروجی با استفاده از این واحد
• 2
دستور compare: اصلاح خروجی جدول در صورتی که بنچ‌مارک‌ها فقط شامل یک نمونه باشند
• 2
حذف گزینه‌های استفاده‌نشدهٔ -C/--control_label و -E/--experiment_label
• 2
به‌روزرسانی وابستگی perf به 0.7.11 برای دسترسی به Benchmark.get_unit() و BenchmarkSuite.get_metadata()
168u
نسخه 0.2.1 (2016-09-10)
0.0
• 2
افزودن گزینهٔ --csv به دستور compare
• 2
اصلاح قالب خروجی compare -O table
• 2
تثبیت وابستگی‌های غیرمستقیم در requirements.txt
• 2
دستور run: افزودن گزینهٔ --track-memory برای ردیابی حداکثر حافظهٔ مصرفی
• 2
به‌روزرسانی وابستگی perf به 0.7.8 جهت پشتیبانی از ردیابی حافظه و گزینهٔ خط فرمان جدید --inherit-environ
• 2
در صورت شکست دستور virtualenv، تلاش با دستوری دیگر برای ساخت محیط مجازی: مدیریت خطای virtualenv
• 2
نخستین دستور برای ارتقای pip به نسخهٔ >= 6.0 اکنون به‌جای python -m pip از باینری pip استفاده می‌کند تا از pip 1.0 که از واسط خط فرمان python -m pip پشتیبانی نمی‌کند، پشتیبانی شود.
• 2
به‌روزرسانی Django (1.10.1)، Mercurial (3.9.1) و psutil (4.3.1)
• 2
تغییر نام گزینهٔ خط فرمان --inherit_env به --inherit-environ و اصلاح آن
168u
نسخه 0.2 (2016-09-01)
0.0
• 2
به‌روزرسانی وابستگی Django به 1.10
• 2
به‌روزرسانی وابستگی Chameleon به 2.24
• 2
افزودن گزینهٔ خط فرمان --venv
• 2
تبدیل بنچ‌مارک‌های راه‌اندازی Python، راه‌اندازی Mercurial و 2to3 به اسکریپت‌های perf (شامل bm_startup.py، bm_hg_startup.py و bm_2to3.py)
• 2
ارسال گزینهٔ --affinity به اسکریپت‌های perf به‌جای استفاده از دستور taskset
• 2
قرار دادن نیازمندی‌های نصاب و اختیاری بیشتری در performance/requirements.txt
• 2
فایل‌های کش‌شدهٔ .pyc دیگر پیش از اجرای یک بنچ‌مارک حذف نمی‌شوند. در صورت نیاز از دستور venv recreate برای به‌روزرسانی محیط مجازی استفاده کنید.
• 2
گزینهٔ معیوب --track_memory حذف شد. این گزینه پس از رفع مشکل دوباره بازگردانده خواهد شد.
• 2
افزودن نسخهٔ performance به فراداده‌ها
• 2
ارتقای وابستگی perf به 0.7.5 برای دریافت Benchmark.update_metadata()
168u
نسخه 0.1.2 (2016-08-27)
0.0
• 2
اکنون از Windows پشتیبانی می‌شود
• 2
افزودن دستور جدید venv برای نمایش، ساخت، ساخت مجدد یا حذف محیط مجازی.
• 2
اصلاح بنچ‌مارک pybench (به‌روزرسانی به رابط برنامه‌نویسی perf 0.7.4)
• 2
اکنون performance تلاش می‌کند تا ماژول psutil را روی CPython نصب کند تا معیارهای سیستمی بهتری در فراداده‌ها و سنجاق کردن پردازنده (CPU pinning) در Python 2 فراهم شود.
• 2
فرایند ایجاد محیط مجازی اکنون علاوه بر دستور virtualenv، ماژول‌های پایتون virtualenv و venv را نیز امتحان می‌کند.
• 2
نسخهٔ در حال توسعهٔ performance اکنون performance را با "pip install -e <path_to_performance>" نصب می‌کند
• 2
نام پروژهٔ GitHub از python/benchmarks به python/performance تغییر یافت.
0.0
• 2
رفع اشکال در ایجاد محیط مجازی (virtual environment)
• 2
تغییر نام اسکریپت pybenchmarks به pyperformance
• 2
افزودن گزینه خط فرمان -p/--python
• 2
افزودن ماژول __main__ برای امکان اجرای: python3 -m performance
168u
نسخه 0.1 (2016-08-24)
0.0
• 2
نخستین انتشار پس از تبدیل به ماژول perf و انتقال به GitHub
• 2
بنچمارک‌های حذف‌شده
2.0
• 2
django_v2, django_v3
• 2
rietveld
• 2
spitfire (و psyco): بسته Spitfire در PyPI موجود نیست
• 2
pystone
• 2
gcbench
• 2
tuple_gc_hell
168u
168u
تاریخچه
پروژه در اوت ۲۰۱۶ به https://github.com/python/performance منتقل شد. ساختار فایل‌ها بازسازماندهی شد و بنچمارک‌ها وصله شدند تا از ماژول perf برای اجرای بنچمارک در چندین فرایند استفاده کنند.
پروژه در دسامبر ۲۰۰۸ توسط Collin Winter و Jeffrey Yasskin برای پروژه Unladen Swallow آغاز شد. این پروژه تا فوریه ۲۰۱۶ در https://hg.python.org/benchmarks میزبانی می‌شد.
سایر بنچمارک‌های پایتون:
0.0
• 2
CPython: سامانه speed.python.org https://speed.python.org از pyperf، pyperformance و Codespeed https://github.com/tobami/codespeed (برنامه وب Django) استفاده می‌کند
• 2
PyPy: سامانه speed.pypy.org http://speed.pypy.org از بنچمارک‌های PyPy https://bitbucket.org/pypy/benchmarks استفاده می‌کند
• 2
Pyston: ابزار pyston-perf https://github.com/dropbox/pyston-perf و speed.pyston.org http://speed.pyston.org
• 2
بنچمارک‌های Numba در http://numba.pydata.org/numba-benchmark
• 2
Cython: دموها/بنچمارک‌های Cython در https://github.com/cython/cython/tree/master/Demos/benchmarks
• 2
pythran: ابزار numpy-benchmarks در https://github.com/serge-sans-paille/numpy-benchmarks
168u
همچنین فهرست پستی سرعت پایتون (Python speed mailing list) https://mail.python.org/mailman/listinfo/speed و ماژول pyperf پایتون http://pyperf.readthedocs.io (مورد استفاده در pyperformance) را ببینید.
ابزار pyperformance هنوز برای PyPy بهینه‌سازی نشده است: در عوض برای سنجش عملکرد PyPy از پروژه بنچمارک‌های PyPy https://foss.heptapod.net/pypy/benchmarks استفاده کنید.
تصویر تولیدشده توسط bm_raytrace (ردیابی پرتو در پایتون خالص):
[image: Pure Python raytracer]
[image]
"نویسندگان (AUTHORS)"
Victor Stinner
"کپی‌رایت و تکثیر (COPYRIGHT)"
2017, Victor Stinner
February 8, 2026 1.14.0