{ "info": { "author": "", "author_email": "", "bugtrack_url": null, "classifiers": [ "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.6" ], "description": "FluidPythran: easily speedup your Python code with Pythran\n==========================================================\n\n|release| |docs| |coverage|\n\n.. |release| image:: https://img.shields.io/pypi/v/fluidpythran.svg\n :target: https://pypi.python.org/pypi/fluidpythran/\n :alt: Latest version\n\n.. |docs| image:: https://readthedocs.org/projects/fluidpythran/badge/?version=latest\n :target: http://fluidpythran.readthedocs.org\n :alt: Documentation status\n\n.. |coverage| image:: https://codecov.io/bb/fluiddyn/fluidpythran/branch/default/graph/badge.svg\n :target: https://codecov.io/bb/fluiddyn/fluidpythran/branch/default/\n :alt: Code coverage\n\n**Documentation**: https://fluidpythran.readthedocs.io\n\n.. warning ::\n\n FluidPythran is still in a quite early stage. Remarks and suggestions are\n very welcome.\n\n However, FluidPythran is now really usable and used \"in production\" in\n `FluidSim `_ (see examples for\n `blocks\n `_,\n `@boost\n `_\n and `@cachedjit\n `_).\n\nFluidPythran is a pure Python package (requiring Python >= 3.6 or Pypy3) to\nhelp to write Python code that *can* use `Pythran\n`_ if it is available.\n\nLet's recall that \"Pythran is an ahead-of-time (AOT) compiler for a subset of\nthe Python language, with a focus on scientific computing. It takes a Python\nmodule annotated with a few interface description and turns it into a native\nPython module with the same interface, but (hopefully) faster.\"\n\nPythran is able to produce **very efficient C++ code and binaries from high\nlevel Numpy code**. If the algorithm is easier to express without loops, don't\nwrite loops!\n\nPythran always releases the `GIL\n`_ and can use `SIMD\ninstructions `_ and `OpenMP\n`_!\n\n**Pythran is not a hard dependency of FluidPythran:** Python code using\nFluidPythran run fine without Pythran and without compilation (and of course\nwithout speedup)!\n\n\nOverview\n--------\n\nPython + Numpy + Pythran is a great combo to easily write highly efficient\nscientific programs and libraries.\n\nTo use Pythran, one needs to isolate the numerical kernels functions in modules\nthat are compiled by Pythran. The C++ code produced by Pythran never uses the\nPython interpreter. It means that only a subset of what is doable in Python can\nbe done in Pythran files. Some `language features\n`_ are not\nsupported by Pythran (for example no classes) and most of the extension\npackages cannot be used in Pythran files (basically `only Numpy and some Scipy\nfunctions `_).\n\nAnother cause of frustration for Python developers when using Pythran is\nrelated to manual writting of Pythran function signatures in comments, which\ncan not be automated. Pythran uses C++ templates but Pythran users can not\nthink with this concept. We would like to be able to **express the templated\nnature of Pythran with modern Python syntax** (in particular **type\nannotations**).\n\nFinally, another limitation is that it is not possible to use Pythran for\n**just-in-time** (JIT) compilation so one needs to manually write all argument\ntypes.\n\nWith FluidPythran, we try to overcome these limitations. FluidPythran provides\nfew supplementary Pythran commands and a small Python API to accelerate\nfunctions and methods with Pythran without writing the Pythran modules. The\ncode of the numerical kernels can stay in the modules and in the classes where\nthey were written. The Pythran files (i.e. the files compiled by Pythran),\nwhich are usually written by the user, are produced automatically by\nFluidPythran.\n\nBonus: There are FluidPythran syntaxes for both **ahead-of-time** and\n**just-in-time** compilations!\n\nAt run time, FluidPythran uses when possible the pythranized functions, but\nlet's stress again that codes using FluidPythran work fine without Pythran (of\ncourse without speedup)!\n\nTo summarize, a **strategy to quickly develop a very efficient scientific\napplication/library** with Python could be:\n\n- Use modern Python coding, standard Numpy/Scipy for the computations and all\n the cool libraries you want.\n\n- Profile your applications on real cases, detect the bottlenecks and apply\n standard optimizations with Numpy.\n\n- Add few lines of FluidPythran to compile the hot spots.\n\n**Implementation details:** Under the hood, FluidPythran creates Pythran files\n(one per module for AOT compilation and one per function for JIT compilation)\nthat can be compiled at build, import or run times depending of the cases. Note\nthat the developers can still read the Pythran files if needed.\n\n.. tip ::\n\n FluidPythran is really convenient for experimenting and benchmarking with\n Pythran (as for example these comparisons `with Julia\n `_\n and `with Numba\n `__):\n\n - The whole code can be gathered in one Python file.\n\n - With the :code:`@cachedjit` decorator, we don't need to add the types and\n to launch compilation commands!\n\n - Even without :code:`@cachedjit` (i.e. with AOT compilation), it is easy to\n trigger a mode in which FluidPythran automatically takes care of all\n compilation steps (see `set_pythranize_at_import `__).\n\n.. note ::\n\n FluidPythran can be used in libraries and applications using MPI (as\n `FluidSim `_).\n\n\nInstallation\n------------\n\n.. code ::\n\n pip install fluidpythran\n\nThe environment variable :code:`FLUIDPYTHRAN_DIR` can be set to control where\nthe cached files are saved.\n\n\nA short tour of FluidPythran syntaxes\n-------------------------------------\n\nDecorator :code:`boost` and command :code:`# pythran def`\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. code :: python\n\n import h5py\n import mpi4py\n\n from fluidpythran import boost\n\n # pythran def myfunc(int, float)\n\n @boost\n def myfunc(a, b):\n return a * b\n\n ...\n\nMost of this code looks familiar to Pythran users. The differences:\n\n- One can use (for example) h5py and mpi4py (of course not in the Pythran\n functions).\n\n- :code:`# pythran def` instead of :code:`# pythran export` (to stress that it\n is not the same command).\n\n- A tiny bit of Python... The decorator :code:`@boost` replaces the\n Python function by the pythranized function if FluidPythran has been used to\n produced the associated Pythran file.\n\n\nPythran using type annotations\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe previous example can be rewritten without Pythran commands:\n\n.. code :: python\n\n import h5py\n import mpi4py\n\n from fluidpythran import boost\n\n @boost\n def myfunc(a: int, b: float):\n return a * b\n\n ...\n\nNice (shorter and clearer than with the Pythran command) but very limited... So\none can also elegantly define many Pythran signatures using in the annotations\ntype variables and Pythran types in strings (see `these examples\n`_).\nMoreover, it is possible to mix type hints and :code:`# pythran def` commands.\n\nCached Just-In-Time compilation\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nWith FluidPythran, one can use the Ahead-Of-Time compiler Pythran in a\nJust-In-Time mode. It is really the **easiest way to speedup a function with\nPythran**, just by adding a decorator! And it also works `in notebooks\n`_!\n\nIt is a \"work in progress\" so (i) it could be buggy and (ii) the API is not\ngreat, but it is a good start!\n\n.. code :: python\n\n import numpy as np\n\n # pythran import numpy as numpy\n\n from fluidpythran import cachedjit, used_by_cachedjit\n\n @used_by_cachedjit(\"func1\")\n def func0(a, b):\n return a + b\n\n @cachedjit\n def func1(a, b):\n return np.exp(a) * b * func0(a, b)\n\nNote that the :code:`@cachedjit` decorator takes into account type hints (see\n`the example in the documentation\n`_).\n\n**Implementation details for just-in-time compilation:** A Pythran file is\nproduced for each \"cachedjited\" function (function decorated with\n:code:`@cachedjit`). The file is compiled at the first call of the function and\nthe compiled version is used as soon as it is ready. The warmup can be quite\nlong but the compiled version is saved and can be reused (without warmup!) by\nanother process.\n\n\nCommand :code:`# pythran block`\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nFluidPythran blocks can be used with classes and more generally in functions\nwith lines that cannot be compiled by Pythran.\n\n.. code :: python\n\n from fluidpythran import FluidPythran\n\n fp = FluidPythran()\n\n class MyClass:\n\n ...\n\n def func(self, n):\n a, b = self.something_that_cannot_be_pythranized()\n\n if fp.is_transpiled:\n result = fp.use_pythranized_block(\"name_block\")\n else:\n # pythran block (\n # float a, b;\n # int n\n # ) -> result\n\n # pythran block (\n # complex a, b;\n # int n\n # ) -> result\n\n result = a**n + b**n\n\n return self.another_func_that_cannot_be_pythranized(result)\n\nFor blocks, we need a little bit more of Python.\n\n- At import time, we have :code:`fp = FluidPythran()`, which detects which\n Pythran module should be used and imports it. This is done at import time\n since we want to be very fast at run time.\n\n- In the function, we define a block with three lines of Python and special\n Pythran annotations (:code:`# pythran block`). The 3 lines of Python are used\n (i) at run time to choose between the two branches (:code:`is_transpiled` or\n not) and (ii) at compile time to detect the blocks.\n\nNote that the annotations in the command :code:`# pythran block` are different\n(and somehow easier to write) than in the standard command :code:`# pythran\nexport`.\n\n`Blocks can now also be defined with type hints!\n`_\n\n.. warning ::\n\n I'm not satisfied by the syntax for Pythran blocks so I (PA) proposed an\n alternative syntax in `issue #29\n `_.\n\nPython classes: :code:`@boost` and :code:`@cachedjit` for methods\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nFor simple methods **only using attributes**, we can write:\n\n.. code :: python\n\n import numpy as np\n\n from fluidpythran import boost\n\n A = \"float[:]\"\n\n @boost\n class MyClass:\n\n arr0: A\n arr1: A\n\n def __init__(self, n):\n self.arr0 = np.zeros(n)\n self.arr1 = np.zeros(n)\n\n @boost\n def compute(self, alpha: float):\n return (self.arr0 + self.arr1).mean() ** alpha\n\n.. warning ::\n\n Calling another method in a Pythranized method is not yet supported!\n\nMore examples of how to use FluidPythran for Object Oriented Programing are\ngiven `here\n`__.\n\n\nMake the Pythran files\n----------------------\n\nThere is a command-line tool :code:`fluidpythran` which makes the associated\nPythran files from Python files with annotations and fluidpythran code. By\ndefault and if Pythran is available, the Pythran files are compiled.\n\nThere is also a function :code:`make_pythran_files` that can be used in a\nsetup.py like this:\n\n.. code ::\n\n from pathlib import Path\n\n from fluidpythran.dist import make_pythran_files\n\n here = Path(__file__).parent.absolute()\n\n paths = [\"fluidsim/base/time_stepping/pseudo_spect.py\"]\n make_pythran_files([here / path for path in paths], mocked_modules=[\"h5py\"])\n\nNote that the function :code:`make_pythran_files` does not use Pythran.\nCompiling the associated Pythran file can be done if wanted (see for example\nhow it is done in the example package `example_package_fluidpythran\n`_ or in\n`fluidsim's setup.py\n`_).\n\n.. _pythranize-at-import :\n\nIf the environment variable :code:`PYTHRANIZE_AT_IMPORT` is set, FluidPythran\ncompiles at import time (i.e. only when needed) the Pythran file associated\nwith the imported module. This behavior can also be triggered programmatically\nby using the function :code:`set_pythranize_at_import`.\n\nLicense\n-------\n\nFluidDyn is distributed under the CeCILL-B_ License, a BSD compatible\nfrench license.\n\n.. _CeCILL-B: http://www.cecill.info/index.en.html", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "", "keywords": "pythran", "license": "CeCILL-B License", "maintainer": "", "maintainer_email": "", "name": "fluidpythran", "package_url": "https://pypi.org/project/fluidpythran/", "platform": "", "project_url": "https://pypi.org/project/fluidpythran/", "project_urls": null, "release_url": "https://pypi.org/project/fluidpythran/0.1.7/", "requires_dist": null, "requires_python": "", "summary": "Easily speedup your Python code with Pythran", "version": "0.1.7" }, "last_serial": 4702041, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "451ff46708387d44551f7d41fda83a7f", "sha256": "61d785e496c3fd90b2907d9cdd1e141ba375d57925e07296b71d50b239ce714a" }, "downloads": -1, "filename": "fluidpythran-0.0.1.tar.gz", "has_sig": false, "md5_digest": "451ff46708387d44551f7d41fda83a7f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22217, "upload_time": "2018-10-04T15:15:58", "url": "https://files.pythonhosted.org/packages/ff/29/db0236dbf7c01f4ca208f004d89950cf1d1ce04d327643bb037840776e79/fluidpythran-0.0.1.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "bb7a22478cf0c64aa0ec43e09e29b8b4", "sha256": "b939cc679621fcb5b82edc4ddc26b86a7015794a066f1af627475bc7d1dbd660" }, "downloads": -1, "filename": "fluidpythran-0.0.2.tar.gz", "has_sig": false, "md5_digest": "bb7a22478cf0c64aa0ec43e09e29b8b4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22963, "upload_time": "2018-10-05T13:11:56", "url": "https://files.pythonhosted.org/packages/22/5c/29364287f3628a606613bedf82b094f9b32b0ada2844ef18f724cde587bf/fluidpythran-0.0.2.tar.gz" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "2f6e643a2e38cbeace32f3e728714d47", "sha256": "e450aa2493e208468107c0c9a680ac256f6637b62870377498a970725c63cf26" }, "downloads": -1, "filename": "fluidpythran-0.0.3.tar.gz", "has_sig": false, "md5_digest": "2f6e643a2e38cbeace32f3e728714d47", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26594, "upload_time": "2018-10-07T19:12:16", "url": "https://files.pythonhosted.org/packages/11/db/7b0bd4327ecbf2b92d113b5971206604496a820976c14cadfa9f9f149132/fluidpythran-0.0.3.tar.gz" } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "deb7ff7b58f6f760bbbd072b86d7a947", "sha256": "d9f5ffe67c0987159efe8a45cd548bd2d2dcde13e29946838683b0c65bf0e25e" }, "downloads": -1, "filename": "fluidpythran-0.0.4.tar.gz", "has_sig": false, "md5_digest": "deb7ff7b58f6f760bbbd072b86d7a947", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27192, "upload_time": "2018-10-09T02:24:12", "url": "https://files.pythonhosted.org/packages/90/f4/2c5311195922c9f9dc8cea4a866842065f89443382610dec2efe545e7a6a/fluidpythran-0.0.4.tar.gz" } ], "0.0.5": [ { "comment_text": "", "digests": { "md5": "538f726f443f58a7536dbeea68a3a5f2", "sha256": "8ba746aa255f4293ca1b553551f88b800cf20a31ddf25221fe7274eb3ce03be1" }, "downloads": -1, "filename": "fluidpythran-0.0.5.tar.gz", "has_sig": false, "md5_digest": "538f726f443f58a7536dbeea68a3a5f2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12224, "upload_time": "2018-10-14T09:06:09", "url": "https://files.pythonhosted.org/packages/4d/6d/72e48c24c97802f2fdab3e19d3dbf16e323100b433173695d73b3dd6f166/fluidpythran-0.0.5.tar.gz" } ], "0.0.6": [ { "comment_text": "", "digests": { "md5": "991241629d54dbb791477aed4983bf60", "sha256": "dbfe88f43884c81521a576d8a3a2c8286c2100ad8562aab53505f9549393cfe4" }, "downloads": -1, "filename": "fluidpythran-0.0.6.tar.gz", "has_sig": false, "md5_digest": "991241629d54dbb791477aed4983bf60", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 32494, "upload_time": "2018-11-06T21:17:54", "url": "https://files.pythonhosted.org/packages/30/ca/0111cb671dd5179894c8fa9cf869fe840680b36d3d897058467b1cc41c6f/fluidpythran-0.0.6.tar.gz" } ], "0.0.6.post0": [ { "comment_text": "", "digests": { "md5": "cc7c36975725352cbaefcdf2330ee795", "sha256": "acdedfb83ba4bb1a40ac3058a51956ddb6070b18542ab695f7dacc11ce36bc5a" }, "downloads": -1, "filename": "fluidpythran-0.0.6.post0.tar.gz", "has_sig": false, "md5_digest": "cc7c36975725352cbaefcdf2330ee795", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 32623, "upload_time": "2018-11-07T14:35:54", "url": "https://files.pythonhosted.org/packages/37/34/f1af18a4cedead635f2f31b645e44fd8a4a68c7d6f5bc7cebe9258f32ab2/fluidpythran-0.0.6.post0.tar.gz" } ], "0.0.7": [ { "comment_text": "", "digests": { "md5": "79040ff0cd18b2d7b54203e8464d8e1e", "sha256": "7ae886a4573d26629bade1ecdedf38af0f5336927999e3a7db049ada32f4d360" }, "downloads": -1, "filename": "fluidpythran-0.0.7.tar.gz", "has_sig": false, "md5_digest": "79040ff0cd18b2d7b54203e8464d8e1e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 45232, "upload_time": "2018-11-15T16:03:30", "url": "https://files.pythonhosted.org/packages/ad/b6/749007d549341b5afbc6c0c973ca657d27361d251491fe9fa29cbe2e2d33/fluidpythran-0.0.7.tar.gz" } ], "0.0.8": [ { "comment_text": "", "digests": { "md5": "48ce493757be908be08ca570c0c2b809", "sha256": "c423b03f4286f112c93efedee31754e71217861c781091fe31afb17c10bdd1cb" }, "downloads": -1, "filename": "fluidpythran-0.0.8.tar.gz", "has_sig": false, "md5_digest": "48ce493757be908be08ca570c0c2b809", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 47261, "upload_time": "2018-11-16T18:48:06", "url": "https://files.pythonhosted.org/packages/6f/3d/e3444aebb0e54ec31ca5364f153ee23e7cb778a39a1a75e811a991a45fb8/fluidpythran-0.0.8.tar.gz" } ], "0.0.8.post0": [ { "comment_text": "", "digests": { "md5": "b3aa8f52f4da5a87c11563b9d1c63511", "sha256": "faf5ec4b5e8cdacb2cb57be63f87072bd39d80196a1bf5fee6c3a533201a3ca0" }, "downloads": -1, "filename": "fluidpythran-0.0.8.post0.tar.gz", "has_sig": false, "md5_digest": "b3aa8f52f4da5a87c11563b9d1c63511", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 47418, "upload_time": "2018-11-17T10:34:10", "url": "https://files.pythonhosted.org/packages/a6/80/ed8e841eed6f42fdb6d57760a978324c05c8e932590d89ba26bd76770809/fluidpythran-0.0.8.post0.tar.gz" } ], "0.0.9": [ { "comment_text": "", "digests": { "md5": "a0ef951e6e0b9a4a96621003d049b1af", "sha256": "1e4e5d24375d89e5d785f5806615111039876f31955ddb34765a33a17d9a59c4" }, "downloads": -1, "filename": "fluidpythran-0.0.9.tar.gz", "has_sig": false, "md5_digest": "a0ef951e6e0b9a4a96621003d049b1af", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 52313, "upload_time": "2018-11-20T16:11:11", "url": "https://files.pythonhosted.org/packages/01/8f/84c7c2553aeceddd95ae31db3900e56458029a759a968e4448d0c04fb6f5/fluidpythran-0.0.9.tar.gz" } ], "0.1.0": [ { "comment_text": "", "digests": { "md5": "f8fece5e44e2b81e7023afe6970d4986", "sha256": "cae5397acca40421361714fd2de3d647ea818dd3b7285feaeb5fb25641dca571" }, "downloads": -1, "filename": "fluidpythran-0.1.0.tar.gz", "has_sig": false, "md5_digest": "f8fece5e44e2b81e7023afe6970d4986", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 54013, "upload_time": "2018-11-23T11:10:03", "url": "https://files.pythonhosted.org/packages/e4/39/7152761e3b213391a3b3b37e8f7b43c42b1f3adf74547e5b3477f3ea8717/fluidpythran-0.1.0.tar.gz" } ], "0.1.0.post0": [ { "comment_text": "", "digests": { "md5": "a167283246b869f299ae52b25dce3444", "sha256": "e10a286e7a867e8128224e16510c53da8c37ec8f02e93b1bc5e56f6e86d6bcf4" }, "downloads": -1, "filename": "fluidpythran-0.1.0.post0.tar.gz", "has_sig": false, "md5_digest": "a167283246b869f299ae52b25dce3444", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 54024, "upload_time": "2018-11-23T12:06:45", "url": "https://files.pythonhosted.org/packages/d2/2b/a20ebc329591ff9b7135a06b52533d021c709410d3e1fb467578942329ea/fluidpythran-0.1.0.post0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "8b14106c7e0f3da9bad1bbfc5c7b1206", "sha256": "853f995c0ce77741bd617e88d4cdde7d54cf4d34f6cf7a86fa144eee622e164a" }, "downloads": -1, "filename": "fluidpythran-0.1.1.tar.gz", "has_sig": false, "md5_digest": "8b14106c7e0f3da9bad1bbfc5c7b1206", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 54914, "upload_time": "2018-11-27T19:52:05", "url": "https://files.pythonhosted.org/packages/ba/ad/9e46e320e4a876cdaa749a88a848a6652cc0aa18014f00dcd096df3da24d/fluidpythran-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "74a1043406880cbcfc01905f516c106b", "sha256": "ed1630223d39b8d66295c07400d773c02e1b6c76912c71df6abbebc3b105679b" }, "downloads": -1, "filename": "fluidpythran-0.1.2.tar.gz", "has_sig": false, "md5_digest": "74a1043406880cbcfc01905f516c106b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 56712, "upload_time": "2018-12-03T16:30:45", "url": "https://files.pythonhosted.org/packages/ad/06/54141aae8aacbc3f4e34574247a535e953159038fe3f6e02c658b55f511b/fluidpythran-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "e432d157e8df6c6e946658ba9d3f31cd", "sha256": "661727d50fec4ded9a1ed73f9ac75ed94d388be6f1f5aa3ce8114209d4c1b740" }, "downloads": -1, "filename": "fluidpythran-0.1.3.tar.gz", "has_sig": false, "md5_digest": "e432d157e8df6c6e946658ba9d3f31cd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 57602, "upload_time": "2018-12-04T13:39:31", "url": "https://files.pythonhosted.org/packages/63/96/5ebf0262604799e262eebca92f929084df65991800e07540430ae9fc1279/fluidpythran-0.1.3.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "564d8b81170ff3c07a0711751411b4a8", "sha256": "bb92412422fe0e009d7d19de09851ed9eccc8eff01ca232b9ce144ac7fba8e0a" }, "downloads": -1, "filename": "fluidpythran-0.1.4.tar.gz", "has_sig": false, "md5_digest": "564d8b81170ff3c07a0711751411b4a8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 63033, "upload_time": "2018-12-07T16:41:48", "url": "https://files.pythonhosted.org/packages/c6/77/421a29d02f353b7cc56d65361e3bcb9039e15067952b517248bc70a6c1bb/fluidpythran-0.1.4.tar.gz" } ], "0.1.5": [ { "comment_text": "", "digests": { "md5": "fbd498df8b062167c055028c12c2fdb2", "sha256": "16c6a29e3da74044e42711279052dec170eae64fef9fc5ec8c30db8e2426c950" }, "downloads": -1, "filename": "fluidpythran-0.1.5.tar.gz", "has_sig": false, "md5_digest": "fbd498df8b062167c055028c12c2fdb2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 67198, "upload_time": "2018-12-12T15:45:00", "url": "https://files.pythonhosted.org/packages/ba/93/cc01396da67221e317abbed1ee85764df6f8526cbbc5e56af5d9e3d93888/fluidpythran-0.1.5.tar.gz" } ], "0.1.7": [ { "comment_text": "", "digests": { "md5": "3e1f08da3b150057c1545d86f9d25e08", "sha256": "d60a792a28c1f444ef2db817db50522829fa6c6aebcf862dc356341007e1735c" }, "downloads": -1, "filename": "fluidpythran-0.1.7-py3-none-any.whl", "has_sig": false, "md5_digest": "3e1f08da3b150057c1545d86f9d25e08", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 49649, "upload_time": "2019-01-16T08:06:51", "url": "https://files.pythonhosted.org/packages/83/aa/f212d39abfe0c994a2d1b3a39336fc5634d94e60fca965d01852fe23e96c/fluidpythran-0.1.7-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a082f641fe5f76397fd162452d58053e", "sha256": "e8b4e3123624870b6dc1faef4817010a0de5c91a3816a285168264aea5491217" }, "downloads": -1, "filename": "fluidpythran-0.1.7.tar.gz", "has_sig": false, "md5_digest": "a082f641fe5f76397fd162452d58053e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 37725, "upload_time": "2018-12-18T12:41:58", "url": "https://files.pythonhosted.org/packages/25/15/007856957d2269dc7bcaff789ec6304d46135a1ce3cc4dfcca35950cfc4d/fluidpythran-0.1.7.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "3e1f08da3b150057c1545d86f9d25e08", "sha256": "d60a792a28c1f444ef2db817db50522829fa6c6aebcf862dc356341007e1735c" }, "downloads": -1, "filename": "fluidpythran-0.1.7-py3-none-any.whl", "has_sig": false, "md5_digest": "3e1f08da3b150057c1545d86f9d25e08", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 49649, "upload_time": "2019-01-16T08:06:51", "url": "https://files.pythonhosted.org/packages/83/aa/f212d39abfe0c994a2d1b3a39336fc5634d94e60fca965d01852fe23e96c/fluidpythran-0.1.7-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a082f641fe5f76397fd162452d58053e", "sha256": "e8b4e3123624870b6dc1faef4817010a0de5c91a3816a285168264aea5491217" }, "downloads": -1, "filename": "fluidpythran-0.1.7.tar.gz", "has_sig": false, "md5_digest": "a082f641fe5f76397fd162452d58053e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 37725, "upload_time": "2018-12-18T12:41:58", "url": "https://files.pythonhosted.org/packages/25/15/007856957d2269dc7bcaff789ec6304d46135a1ce3cc4dfcca35950cfc4d/fluidpythran-0.1.7.tar.gz" } ] }