{ "info": { "author": "Arthur Skowronek", "author_email": "eisensheng@mailbox.org", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: POSIX", "Operating System :: POSIX :: Linux", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.2", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: Implementation", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Software Development", "Topic :: Software Development :: Libraries", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: System", "Topic :: System :: Benchmark", "Topic :: Utilities" ], "description": "Chronometer\r\n===========\r\n\r\n.. image:: https://img.shields.io/travis/eisensheng/chronometer.svg?style=flat\r\n :target: https://travis-ci.org/eisensheng/chronometer\r\n :alt: Continuous Integration\r\n\r\n.. image:: https://img.shields.io/coveralls/eisensheng/chronometer/develop.svg?style=flat\r\n :target: https://coveralls.io/r/eisensheng/chronometer?branch=develop\r\n :alt: Test Coverage\r\n\r\n.. image:: https://readthedocs.org/projects/chronometer/badge/?version=latest&style=flat\r\n :target: http://chronometer.readthedocs.org/en/latest/\r\n :alt: Documentation\r\n\r\n.. image:: https://pypip.in/version/chronometer/badge.svg?style=flat\r\n :target: https://pypi.python.org/pypi/chronometer/\r\n :alt: Latest Version\r\n\r\n.. image:: https://pypip.in/py_versions/chronometer/badge.svg?style=flat\r\n :target: https://pypi.python.org/pypi/chronometer/\r\n :alt: Python versions\r\n\r\n.. image:: https://pypip.in/license/chronometer/badge.svg?style=flat\r\n :target: https://github.com/eisensheng/chronometer/blob/develop/COPYING\r\n :alt: MIT License\r\n\r\nYet another simple time measurement tool for Python. The goal of this\r\nimplementation is to avoid as much cruft as possible. The current version\r\nis 72 lines of actual code long, leaving out blank, doc and comment lines.\r\nChronometer provides only functions to measure how much wall-clock time\r\nhas passed between starting and stopping the timer.\r\n\r\nNothing more. Nothing less.\r\n\r\nChronometer tries to stay accurate to the actual time spent between\r\nstarting and stopping the timer by utilizing a monotonic timer. According\r\nto the linux manual a monotonic timer is subject to time adjustments so\r\nit stays accurate but will never move backwards or jump. It will be\r\nadjusted gradually and always moves forward as long as the system runs.\r\n\r\n\r\nExamples\r\n--------\r\n\r\nEasy:\r\n\r\n.. code-block:: python\r\n\r\n import time\r\n from chronometer import Chronometer\r\n\r\n long_running_task = lambda: time.sleep(3.)\r\n\r\n with Chronometer() as t:\r\n long_running_task() # that will take a few seconds.\r\n print('Phew, that took me {:.3f} seconds!'.format(float(t)))\r\n\r\n\r\nAdvanced:\r\n\r\n.. code-block:: python\r\n\r\n from time import sleep\r\n from chronometer import Chronometer\r\n\r\n counter = 0\r\n def long_running_task_that_can_fail():\r\n global counter\r\n counter += 1\r\n sleep(2.)\r\n return counter > 3\r\n\r\n with Chronometer() as t:\r\n while not long_running_task_that_can_fail():\r\n print('Failed after {:.3f} seconds!'.format(t.reset()))\r\n print('Success after {:.3f} seconds!'.format(float(t)))\r\n\r\n\r\nRidiculous:\r\n\r\n.. code-block:: python\r\n\r\n import asyncio\r\n from chronometer import Chronometer\r\n\r\n\r\n class PingEchoServerProtocol(asyncio.StreamReaderProtocol):\r\n\r\n def __init__(self):\r\n super().__init__(asyncio.StreamReader(), self.client_connected)\r\n self.reader, self.writer = None, None\r\n self.latency_timer = Chronometer()\r\n\r\n def client_connected(self, reader, writer):\r\n self.reader, self.writer = reader, writer\r\n asyncio.async(self.ping_loop())\r\n asyncio.async(self.handler())\r\n\r\n @asyncio.coroutine\r\n def send(self, data):\r\n self.writer.write(data.encode('utf-8') + b'\\n')\r\n yield from self.writer.drain()\r\n\r\n @asyncio.coroutine\r\n def ping_loop(self):\r\n yield from asyncio.sleep(5.)\r\n while True:\r\n if self.latency_timer.stopped:\r\n self.latency_timer.start()\r\n yield from self.send('PING (send me PONG!)')\r\n\r\n sleep_duration = max(2., 10. - self.latency_timer.elapsed)\r\n yield from asyncio.sleep(sleep_duration)\r\n\r\n @asyncio.coroutine\r\n def handler(self):\r\n while True:\r\n data = (yield from self.reader.readline())\r\n if data[:4] == b'PONG' and self.latency_timer.started:\r\n yield from self.send(('Latency: {:.3f}s'\r\n .format(self.latency_timer.stop())))\r\n\r\n l = asyncio.get_event_loop()\r\n\r\n @asyncio.coroutine\r\n def startup():\r\n s = (yield from l.create_server(lambda: PingEchoServerProtocol(),\r\n host='localhost', port=2727))\r\n print('Now telnet to localhost 2727')\r\n yield from s.wait_closed()\r\n\r\n l.run_until_complete(startup())", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/eisensheng/chronometer", "keywords": "", "license": "MIT License", "maintainer": "", "maintainer_email": "", "name": "chronometer", "package_url": "https://pypi.org/project/chronometer/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/chronometer/", "project_urls": { "Download": "UNKNOWN", "Homepage": "https://github.com/eisensheng/chronometer" }, "release_url": "https://pypi.org/project/chronometer/1.0/", "requires_dist": null, "requires_python": null, "summary": "Yet another simple time measurement tool for Python with less cruft and more features.", "version": "1.0" }, "last_serial": 1356519, "releases": { "1.0": [ { "comment_text": "", "digests": { "md5": "595bb6883bfea1970f4188a18a84191f", "sha256": "9722198bf8dfd4880da429b739738c0d09f04a5ad901ed43273a092f7978a483" }, "downloads": -1, "filename": "chronometer-1.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "595bb6883bfea1970f4188a18a84191f", "packagetype": "bdist_wheel", "python_version": "3.4", "requires_python": null, "size": 6266, "upload_time": "2014-12-21T19:03:43", "url": "https://files.pythonhosted.org/packages/8b/2e/487bb336e1548506c86d06f818c9ab3014122272773688392ddf08062bbe/chronometer-1.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b89e863450645c935114f683cf1f26c2", "sha256": "ff31478af4ea0e7cb8590702b2605d300e6f4462c52fd3157cd7db18bf2b060f" }, "downloads": -1, "filename": "chronometer-1.0.zip", "has_sig": false, "md5_digest": "b89e863450645c935114f683cf1f26c2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12355, "upload_time": "2014-12-21T19:03:23", "url": "https://files.pythonhosted.org/packages/d5/a6/93bb2c89176c5517033b3409f506e5404f4495d2ba73d9fa45962d844308/chronometer-1.0.zip" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "595bb6883bfea1970f4188a18a84191f", "sha256": "9722198bf8dfd4880da429b739738c0d09f04a5ad901ed43273a092f7978a483" }, "downloads": -1, "filename": "chronometer-1.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "595bb6883bfea1970f4188a18a84191f", "packagetype": "bdist_wheel", "python_version": "3.4", "requires_python": null, "size": 6266, "upload_time": "2014-12-21T19:03:43", "url": "https://files.pythonhosted.org/packages/8b/2e/487bb336e1548506c86d06f818c9ab3014122272773688392ddf08062bbe/chronometer-1.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b89e863450645c935114f683cf1f26c2", "sha256": "ff31478af4ea0e7cb8590702b2605d300e6f4462c52fd3157cd7db18bf2b060f" }, "downloads": -1, "filename": "chronometer-1.0.zip", "has_sig": false, "md5_digest": "b89e863450645c935114f683cf1f26c2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12355, "upload_time": "2014-12-21T19:03:23", "url": "https://files.pythonhosted.org/packages/d5/a6/93bb2c89176c5517033b3409f506e5404f4495d2ba73d9fa45962d844308/chronometer-1.0.zip" } ] }