{ "info": { "author": "Leo Dirac", "author_email": "leo.dirac@gmail.com", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: Apache Software License", "Operating System :: OS Independent", "Programming Language :: Python :: 3" ], "description": "# timebudget\n### A stupidly-simple tool to see where your time is going in Python programs\n\nTrying to figure out where the time's going in your python code? Tired of writing `elapsed = time.time() - start_time`? You can find out with just a few lines of code after you\n\n```\npip install timebudget\n```\n\n## The simplest way\n\nWith just two lines of code (one is the import), you can see how long something takes...\n\n```python\nfrom timebudget import timebudget\n\nwith timebudget(\"Loading and processing the file\"):\n raw = open(filename,'rt').readlines()\n lines = [line.rstrip() for line in raw]\n```\n\nwill print\n\n```\nLoading and processing the file took 1.453sec\n```\n\n\n## Record times and print a report\n\nTo get a report on the total time from functions you care about, just annotate those functions:\n\n```python\nfrom timebudget import timebudget\ntimebudget.set_quiet() # don't show measurements as they happen\ntimebudget.report_at_exit() # Generate report when the program exits\n\n@timebudget # Record how long this function takes\ndef possibly_slow():\n ...\n\n@timebudget # ... and this function too\ndef should_be_fast():\n ...\n```\n\nAnd now when you run your program, you'll see how much time was spent in each annotated function:\n\n```\ntimebudget report...\n possibly_slow: 901.12ms for 3 calls\n should_be_fast: 61.35ms for 2 calls\n```\n\nOr instead of calling `report_at_exit()` you can manually call \n\n```python\ntimebudget.report(reset=True) # print out the report now, and reset the statistics\n```\n\nIf you don't set `reset=True` then the statistics will accumulate into the next report.\n\nYou can also wrap specific blocks of code to be recorded in the report, and optionally override\nthe default `set_quiet` choice for any block:\n\n```python\nwith timebudget(\"load-file\", quiet=False):\n text = open(filename,'rt').readlines()\n```\n\n\n## Percent of time in a loop\n\nIf you are doing something repeatedly, and want to know the percent of time doing different things, time the loop itself, and pass the name to report. That is, add a timebudget annotation or wrapper onto the thing which is happening repeatedly. Each time this method or code-block is entered will now be considered one \"cycle\" and your report will tell you what fraction of time things take within this cycle.\n\n\n```python\n@timebudget\ndef outer_loop():\n if sometimes():\n possibly_slow()\n should_be_fast()\n should_be_fast()\n\nfor _ in range(NUM_CYCLES):\n outer_loop()\n\ntimebudget.report('outer_loop')\n```\n\nThen the report looks like:\n\n```\ntimebudget report per outer_loop cycle...\n outer_loop: 100.0% 440.79ms/cyc @ 1.0 calls/cyc\n possibly_slow: 40.9% 180.31ms/cyc @ 0.6 calls/cyc\n should_be_fast: 13.7% 60.19ms/cyc @ 2.0 calls/cyc\n```\n\nHere, the times in milliseconds are the totals (averages per cycle), not the average time per call. So in the above example, `should_be_fast` is taking about 30ms per call, but being called twice per loop. Similarly, `possibly_slow` is still about 300ms each time it's called, but it's only getting called on 60% of the cycles on average, so on average it's using 41% of the time in `outer_loop` or 180ms.\n\n\n## Requirements\n\nNeeds Python 3.6 or higher. Other libraries are in `requirements.txt` and can be installed like\n\n```\npip install -r requirements.txt # only needed for developing timebudget.\n```\n\n## Testing\n\nTo run tests:\n\n```\npytest\n```\n\n## Inspiration\n\nThis tool is inspired by [TQDM](https://github.com/tqdm/tqdm), the awesome progress bar. TQDM is stupidly simple to add to your code, and just makes it better. I aspire to imitate that.\n\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/leopd/timebudget", "keywords": "profiling tuning", "license": "Apache-2.0", "maintainer": "", "maintainer_email": "", "name": "timebudget", "package_url": "https://pypi.org/project/timebudget/", "platform": "", "project_url": "https://pypi.org/project/timebudget/", "project_urls": { "Homepage": "https://github.com/leopd/timebudget" }, "release_url": "https://pypi.org/project/timebudget/0.7.1/", "requires_dist": null, "requires_python": "", "summary": "Stupidly-simple speed profiling tool for python", "version": "0.7.1", "yanked": false, "yanked_reason": null }, "last_serial": 7355392, "releases": { "0.6": [ { "comment_text": "", "digests": { "md5": "1773178b7279b2784ed45144c57dd1fc", "sha256": "d52229131d181b05d912fdca57445737384add0a4278d3a3bea185598e48f791" }, "downloads": -1, "filename": "timebudget-0.6-py3-none-any.whl", "has_sig": false, "md5_digest": "1773178b7279b2784ed45144c57dd1fc", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8294, "upload_time": "2019-10-22T19:00:08", "upload_time_iso_8601": "2019-10-22T19:00:08.971945Z", "url": "https://files.pythonhosted.org/packages/03/5f/ab621fdc544235500bdbef74acc7930dd9be232fb0c18eb0fb1eabb229a2/timebudget-0.6-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "f6b09a91e22e7f7e3fa6802c7785822a", "sha256": "65875a2cf4e5eb99502458bb85f07129a4e31fdba88b5c243f9aa77a01c38cac" }, "downloads": -1, "filename": "timebudget-0.6.tar.gz", "has_sig": false, "md5_digest": "f6b09a91e22e7f7e3fa6802c7785822a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3724, "upload_time": "2019-10-22T19:00:11", "upload_time_iso_8601": "2019-10-22T19:00:11.390658Z", "url": "https://files.pythonhosted.org/packages/0d/de/58d35359d9dd012e18a60a4dcfbef1e9b2fa411ca299b4832732f93fbdc8/timebudget-0.6.tar.gz", "yanked": false, "yanked_reason": null } ], "0.7": [ { "comment_text": "", "digests": { "md5": "b248a3317df479b1fccf28b99d698a40", "sha256": "30a032b76a3e336886172a3e2658b7161cee1aca75eeaaa67d3c145986b4ff22" }, "downloads": -1, "filename": "timebudget-0.7-py3-none-any.whl", "has_sig": false, "md5_digest": "b248a3317df479b1fccf28b99d698a40", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 9225, "upload_time": "2019-10-31T00:27:36", "upload_time_iso_8601": "2019-10-31T00:27:36.255965Z", "url": "https://files.pythonhosted.org/packages/4b/f9/aafeac4a75564e780b3beebef269deccb5268c22fdfe3b3e1df91788ef2b/timebudget-0.7-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "4b9d9d1c17c2ceb3b08221c892a09e8a", "sha256": "5c8f0bbe90ba2665d4b637d65a83ad63c55a33343d36dcb0ad0721dc69a52d65" }, "downloads": -1, "filename": "timebudget-0.7.tar.gz", "has_sig": false, "md5_digest": "4b9d9d1c17c2ceb3b08221c892a09e8a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4744, "upload_time": "2019-10-31T00:27:37", "upload_time_iso_8601": "2019-10-31T00:27:37.380924Z", "url": "https://files.pythonhosted.org/packages/b7/e3/01f4b36675643d6257e6e1bc6c4519c17176661b05a156e67b554fe0aae2/timebudget-0.7.tar.gz", "yanked": false, "yanked_reason": null } ], "0.7.1": [ { "comment_text": "", "digests": { "md5": "b416a17a7c930d7849238c1b2100d92b", "sha256": "f32ff270b711772c80c6aa34fd82a2a867eba529d02062c91703c71d83266bbc" }, "downloads": -1, "filename": "timebudget-0.7.1-py3-none-any.whl", "has_sig": false, "md5_digest": "b416a17a7c930d7849238c1b2100d92b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 9523, "upload_time": "2020-05-29T20:20:00", "upload_time_iso_8601": "2020-05-29T20:20:00.417150Z", "url": "https://files.pythonhosted.org/packages/95/78/438d8f88adbb11b1cedc1525da9dfad9fc3b378d9e7391958ae234f8f502/timebudget-0.7.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "f220b973de4c92b8b32b977ddd46c08a", "sha256": "2db5abc0e3993ccdedbed3ece7b629db7c5db7ae76bca2b2f378b4b294169813" }, "downloads": -1, "filename": "timebudget-0.7.1.tar.gz", "has_sig": false, "md5_digest": "f220b973de4c92b8b32b977ddd46c08a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5048, "upload_time": "2020-05-29T20:20:02", "upload_time_iso_8601": "2020-05-29T20:20:02.009060Z", "url": "https://files.pythonhosted.org/packages/12/b5/359073c986ba4a23f5c554915bda5f012f382eb6f004b3e81fdc0f21203f/timebudget-0.7.1.tar.gz", "yanked": false, "yanked_reason": null } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "b416a17a7c930d7849238c1b2100d92b", "sha256": "f32ff270b711772c80c6aa34fd82a2a867eba529d02062c91703c71d83266bbc" }, "downloads": -1, "filename": "timebudget-0.7.1-py3-none-any.whl", "has_sig": false, "md5_digest": "b416a17a7c930d7849238c1b2100d92b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 9523, "upload_time": "2020-05-29T20:20:00", "upload_time_iso_8601": "2020-05-29T20:20:00.417150Z", "url": "https://files.pythonhosted.org/packages/95/78/438d8f88adbb11b1cedc1525da9dfad9fc3b378d9e7391958ae234f8f502/timebudget-0.7.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "f220b973de4c92b8b32b977ddd46c08a", "sha256": "2db5abc0e3993ccdedbed3ece7b629db7c5db7ae76bca2b2f378b4b294169813" }, "downloads": -1, "filename": "timebudget-0.7.1.tar.gz", "has_sig": false, "md5_digest": "f220b973de4c92b8b32b977ddd46c08a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5048, "upload_time": "2020-05-29T20:20:02", "upload_time_iso_8601": "2020-05-29T20:20:02.009060Z", "url": "https://files.pythonhosted.org/packages/12/b5/359073c986ba4a23f5c554915bda5f012f382eb6f004b3e81fdc0f21203f/timebudget-0.7.1.tar.gz", "yanked": false, "yanked_reason": null } ], "vulnerabilities": [] }