Title: Dramatic slowdown with random.random on free-threading build. · Issue #118392 · python/cpython · GitHub
Open Graph Title: Dramatic slowdown with random.random on free-threading build. · Issue #118392 · python/cpython
X Title: Dramatic slowdown with random.random on free-threading build. · Issue #118392 · python/cpython
Description: This slowdown was found with one of my favorite benchmarks, which is calculating the pi value with the Monte Carlo method. import os import random import time from threading import Thread def monte_carlo_pi_part(n: int, idx: int, results...
Open Graph Description: This slowdown was found with one of my favorite benchmarks, which is calculating the pi value with the Monte Carlo method. import os import random import time from threading import Thread def monte...
X Description: This slowdown was found with one of my favorite benchmarks, which is calculating the pi value with the Monte Carlo method. import os import random import time from threading import Thread def monte...
Opengraph URL: https://github.com/python/cpython/issues/118392
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"Dramatic slowdown with random.random on free-threading build.","articleBody":"\r\n\r\nThis slowdown was found with one of my favorite benchmarks, which is calculating the pi value with the Monte Carlo method.\r\n\r\n```python\r\nimport os\r\nimport random\r\nimport time\r\nfrom threading import Thread\r\n\r\ndef monte_carlo_pi_part(n: int, idx: int, results: list[int]) -\u003e None:\r\n count = 0\r\n for i in range(n):\r\n x = random.random()\r\n y = random.random()\r\n\r\n if x*x + y*y \u003c= 1:\r\n count += 1\r\n results[idx] = count\r\n\r\n\r\nn = 10000\r\nthreads = []\r\nnum_threads = 100\r\nresults = [0] * num_threads\r\na = time.time()\r\nfor i in range(num_threads):\r\n t = Thread(target=monte_carlo_pi_part, args=(n, i, results))\r\n t.start()\r\n threads.append(t)\r\n\r\nwhile threads:\r\n t = threads.pop()\r\n t.join()\r\n\r\nb = time.time()\r\nprint(sum(results) / (n * num_threads) * 4)\r\nprint(b-a)\r\n```\r\n\r\nAcquiring critical sections for random methods causes this slowdown.\r\nRemoving `@critical_section` from the method, which uses `genrand_uint32` and then updating `genrand_uint32` to use atomic operation makes the performance acceptable.\r\n\r\n| Build | Elapsed | PI |\r\n|--------------------------------------------------------|---------------------|----------|\r\n| Default (with specialization) | 0.16528010368347168 | 3.144508 |\r\n| Free-threading (with no specialization) | 0.548654317855835 | 3.1421 |\r\n| Free-threading with my patch (with no specialization) | 0.2606849670410156 | 3.141108 |\r\n\r\n\r\n\u003c!-- gh-linked-prs --\u003e\r\n### Linked PRs\r\n* gh-118393\r\n* gh-118396\n\u003c!-- /gh-linked-prs --\u003e\r\n","author":{"url":"https://github.com/corona10","@type":"Person","name":"corona10"},"datePublished":"2024-04-29T14:38:30.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":5},"url":"https://github.com/118392/cpython/issues/118392"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:121340ba-b051-4af2-c7db-062da07e2acc |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | 903C:F74F6:B82685:F8ECAF:696ABEDA |
| html-safe-nonce | 75af44fb9e44d2943f3a8fcaa927218c840f772d840ad3d53d73a090c06091c8 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiI5MDNDOkY3NEY2OkI4MjY4NTpGOEVDQUY6Njk2QUJFREEiLCJ2aXNpdG9yX2lkIjoiNDg4OTA0NTkwMjg0MTAwMzczOCIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9 |
| visitor-hmac | ad551acb0de6b261dc5f97eaf875842ba817a4429a32dff100100145ba9d0c54 |
| hovercard-subject-tag | issue:2269225240 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/python/cpython/118392/issue_layout |
| twitter:image | https://opengraph.githubassets.com/5bf6599603d7fe3a80ed9aeddcb43ae6c8bf894b88c384050cba8da81eaf4ae6/python/cpython/issues/118392 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/5bf6599603d7fe3a80ed9aeddcb43ae6c8bf894b88c384050cba8da81eaf4ae6/python/cpython/issues/118392 |
| og:image:alt | This slowdown was found with one of my favorite benchmarks, which is calculating the pi value with the Monte Carlo method. import os import random import time from threading import Thread def monte... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | corona10 |
| hostname | github.com |
| expected-hostname | github.com |
| None | 46ce962e0e18113ea447391b6ace8b02d4d2861e57b4fbab3658698f73d8855b |
| turbo-cache-control | no-preview |
| go-import | github.com/python/cpython git https://github.com/python/cpython.git |
| octolytics-dimension-user_id | 1525981 |
| octolytics-dimension-user_login | python |
| octolytics-dimension-repository_id | 81598961 |
| octolytics-dimension-repository_nwo | python/cpython |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 81598961 |
| octolytics-dimension-repository_network_root_nwo | python/cpython |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 30300f30bb3949de255e84a146706a3bdb5c19c9 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width