<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Python on ISciNumPy.dev</title><link>https://iscinumpy.dev/categories/python/</link><description>Recent content in Python on ISciNumPy.dev</description><generator>Hugo</generator><language>en-us</language><managingEditor>henryfs@princeton.edu (Henry Schreiner)</managingEditor><webMaster>henryfs@princeton.edu (Henry Schreiner)</webMaster><lastBuildDate>Mon, 03 Aug 2026 22:50:12 -0400</lastBuildDate><atom:link href="https://iscinumpy.dev/categories/python/index.xml" rel="self" type="application/rss+xml"/><item><title>scikit-build-core 1.0</title><link>https://iscinumpy.dev/post/scikit-build-core-1-0/</link><pubDate>Mon, 06 Jul 2026 12:00:00 -0400</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author><guid>https://iscinumpy.dev/post/scikit-build-core-1-0/</guid><description>&lt;p&gt;&lt;a href="https://scikit-build-core.readthedocs.io"&gt;Scikit-build-core&lt;/a&gt; 1.0, the culmination of a four year project to build the
best compiled code backend for Python, &lt;a href="https://github.com/scikit-build/scikit-build-core/releases/tag/v1.0.0"&gt;is out&lt;/a&gt;. It&amp;rsquo;s a huge release,
with over 90 bugs fixed, over 40 new features, accounting for over a hundred
closed issues. This is the completion of my original vision, and I&amp;rsquo;m really
happy with it. I&amp;rsquo;d like to show off some of the new features, and also discuss
some of the last four months of development that made this possible. This is all
in time for &lt;a href="https://scikit-build.org/events/simple-py/"&gt;SIMPLE-Py&lt;/a&gt;, the workshop I&amp;rsquo;m hosting next week over Python
packaging alongside &lt;a href="https://www.scipy2026.scipy.org"&gt;SciPy 2026&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Claude Code Reviews with Fable</title><link>https://iscinumpy.dev/post/claude-code-reviews/</link><pubDate>Tue, 16 Jun 2026 20:00:00 -0400</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author><guid>https://iscinumpy.dev/post/claude-code-reviews/</guid><description>&lt;p&gt;Fable came out and then disappeared a couple of days later. In that short time,
I managed to run a lot of repository reviews with it, and was really happy with
the results. I&amp;rsquo;ve found and fixed around 400 bugs and 400+ other issues
(performance, simplifications, modernizations) across dozens of my projects,
making several hundred PRs with a nearly 100% merge rate on decided PRs.&lt;/p&gt;</description></item><item><title>🎡 cibuildwheel 4.0</title><link>https://iscinumpy.dev/post/cibuildwheel-4-0-0/</link><pubDate>Sun, 07 Jun 2026 12:00:00 -0400</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author><guid>https://iscinumpy.dev/post/cibuildwheel-4-0-0/</guid><description>&lt;p&gt;&lt;a href="https://cibuildwheel.pypa.io"&gt;cibuildwheel&lt;/a&gt; 4.0.0 is out, with some very big additions. We&amp;rsquo;ve added
&lt;a href="https://peps.python.org/pep-0783"&gt;pyemscripten&lt;/a&gt; 3.13 wheels (uploadable to PyPI!), Python 3.15 (and 3.15t)
betas, and much more! We&amp;rsquo;ve got a new stage: &lt;code&gt;audit&lt;/code&gt;, which applies
&lt;a href="https://github.com/pypa/abi3audit"&gt;&lt;code&gt;abi3audit&lt;/code&gt;&lt;/a&gt; to stable ABI wheels. We now default to running
&lt;a href="https://github.com/adang1345/delvewheel"&gt;delvewheel&lt;/a&gt; to repair Windows wheels. We now have &lt;code&gt;{project}&lt;/code&gt; and &lt;code&gt;{package}&lt;/code&gt;
placeholders for &lt;code&gt;config-settings&lt;/code&gt;, and we set &lt;code&gt;CIBUILDWHEEL_BUILD_IDENTIFIER&lt;/code&gt;
in the build step. We&amp;rsquo;ve also made some nice Android improvements. We&amp;rsquo;ve removed
support for Python 3.8, Python 3.13t, GraalPy 3.11, and Cirrus CI.&lt;/p&gt;</description></item><item><title>Python 3.15</title><link>https://iscinumpy.dev/post/python-315/</link><pubDate>Wed, 06 May 2026 12:00:00 -0500</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author><guid>https://iscinumpy.dev/post/python-315/</guid><description>&lt;p&gt;Python 3.15 beta 1 is out! This is a really impactful release, with some really
big additions. A new lazy import system, a powerful sampling profiler, not one
but two new builtins, the usual color/types/errors updates, and lots of key
changes for developers.&lt;/p&gt;</description></item><item><title>Starting With Agentic AI</title><link>https://iscinumpy.dev/post/starting-with-agentic-ai/</link><pubDate>Tue, 05 May 2026 20:00:00 -0400</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author><guid>https://iscinumpy.dev/post/starting-with-agentic-ai/</guid><description>&lt;p&gt;AI suddenly passed the &amp;ldquo;more time saved than spent&amp;rdquo; point around December 2025.
A little late, I&amp;rsquo;ve finally started using agentic AI in various places over the
last 2-3 months, and wanted to jot down my thoughts on what works, what doesn&amp;rsquo;t
(yet?), and what the future might look like. If you are curious about AI for
programming, or have been skeptical in the past, if &amp;ldquo;AI slop&amp;rdquo; is the first thing
that comes to mind, this post will show you some ways that AI can be really
helpful. Certain tasks have been completely transformed. Notice, I said &amp;ldquo;some&amp;rdquo;,
not &amp;ldquo;all&amp;rdquo;! But it is a lot.&lt;/p&gt;</description></item><item><title>Repo Review 1.0</title><link>https://iscinumpy.dev/post/repo-review-1/</link><pubDate>Sat, 04 Apr 2026 10:52:51 -0500</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author><guid>https://iscinumpy.dev/post/repo-review-1/</guid><description>&lt;p&gt;I&amp;rsquo;ve just released &lt;a href="https://github.com/scientific-python/repo-review"&gt;repo-review&lt;/a&gt; 1.0 with a huge update to the WebApp, along
with some other solid improvements in speed, simplicity, and stability.
Repo-review&amp;rsquo;s two most popular plugins, &lt;a href="https://github.com/scientific-python/cookie"&gt;sp-repo-review&lt;/a&gt; and
&lt;a href="https://validate-pyproject.readthedocs.io"&gt;validate-pyproject&lt;/a&gt;, can take full advantage of the new asynchronous fetching
mechanism. And if you use the upcoming Python 3.15, the CLI is more responsive
than ever thanks to lazy loading!&lt;/p&gt;</description></item><item><title>Working to make Python lazy</title><link>https://iscinumpy.dev/post/flake8-lazy/</link><pubDate>Tue, 24 Mar 2026 09:00:00 -0400</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author><guid>https://iscinumpy.dev/post/flake8-lazy/</guid><description>&lt;p&gt;Python 3.15a7, which is now just a &lt;code&gt;uv python install 3.15&lt;/code&gt; away on all major
platforms, has lazy imports! This exciting feature, proposed in &lt;a href="https://peps.python.org/pep-0810"&gt;PEP 810&lt;/a&gt;,
promises to make CLI applications faster (especially when using flags like
&lt;code&gt;--help&lt;/code&gt;), and could make a lot of large code with lots of imports that don&amp;rsquo;t
always get used faster too. Unlike the earlier, failed attempt, this requires
libraries to put in some work. I&amp;rsquo;ve developed a helper tool to make it easy; I&amp;rsquo;d
like to cover what lazy imports are and how to use my tool. Since this is the
first library that I used AI heavily in developing, the second half of the post
will cover how my experience with AI for a task like this went.&lt;/p&gt;
&lt;p&gt;TL;DR: run &lt;code&gt;uvx flake8-lazy --apply=list&lt;/code&gt; to make your code magically faster on
Python 3.15!&lt;/p&gt;</description></item><item><title>New in boost-histogram 1.7 / Hist 2.10</title><link>https://iscinumpy.dev/post/hist-2-10/</link><pubDate>Fri, 06 Feb 2026 17:16:40 -0500</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author><guid>https://iscinumpy.dev/post/hist-2-10/</guid><description>&lt;figure class="transparent"&gt;
 &lt;img src="https://iscinumpy.dev/post/boost-histogram-06/images/BoostHistogramPythonLogo.png" alt="boost-histogram logo" width="405" /&gt;
&lt;/figure&gt;


&lt;p&gt;I&amp;rsquo;ve just released &lt;a href="https://github.com/scikit-hep/boost-histogram/releases/tag/v1.7.0"&gt;boost-histogram 1.7&lt;/a&gt; and &lt;a href="https://github.com/scikit-hep/hist/releases/tag/v2.10.0"&gt;hist 2.10&lt;/a&gt;, with a major new
feature and a big typing improvement! I&amp;rsquo;d like to quickly outline what&amp;rsquo;s new
here. Python 3.10+ is now required.&lt;/p&gt;</description></item><item><title>How we made Python's packaging library 3x faster</title><link>https://iscinumpy.dev/post/packaging-faster/</link><pubDate>Fri, 09 Jan 2026 13:30:00 -0500</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author><guid>https://iscinumpy.dev/post/packaging-faster/</guid><description>&lt;p&gt;Along with a &lt;a href="https://github.com/pypa/pip"&gt;pip&lt;/a&gt; (and now &lt;a href="https://github.com/pypa/packaging"&gt;packaging&lt;/a&gt;) maintainer, Damian Shaw, I have
been working on making &lt;a href="https://github.com/pypa/packaging"&gt;packaging&lt;/a&gt;, the library behind almost all packaging
related tools, faster at reading versions and specifiers, something tools like
pip have to do thousands of times during resolution. Using Python 3.15&amp;rsquo;s new
statistical profiler and metadata from every package ever uploaded to PyPI, I
measured and improved core Packaging constructs while keeping the code readable
and simple. Reading in &lt;code&gt;Version&lt;/code&gt;s can be up to 2x faster and &lt;code&gt;SpecifierSet&lt;/code&gt;s can
be up to 3x faster in &lt;a href="https://github.com/pypa/packaging/releases/tag/26.0"&gt;packaging &lt;code&gt;26.0&lt;/code&gt;&lt;/a&gt;, now released! Other
operations have been optimized, as well, up to 5x in some cases. See the
&lt;a href="https://discuss.python.org/t/announcement-packaging-26-0rc1-released/105631"&gt;announcement&lt;/a&gt; and &lt;a href="https://packaging.pypa.io/en/stable/changelog.html"&gt;release notes&lt;/a&gt; too; this post will focus on the
performance work only.&lt;/p&gt;</description></item><item><title>UHI 1.0: histogram serialization</title><link>https://iscinumpy.dev/post/uhi-1-0/</link><pubDate>Wed, 20 Aug 2025 16:00:00 -0400</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author><guid>https://iscinumpy.dev/post/uhi-1-0/</guid><description>&lt;p&gt;&lt;a href="https://github.com/scikit-hep/uhi/releases/tag/v1.0.0"&gt;UHI 1.0&lt;/a&gt; is out, with a major new feature: a new histogram serialization
spec! This spec supports multiple formats (HDF5, zip, and JSON initially), and
can be supported by multiple libraries (Boost-histogram/hist initially). There&amp;rsquo;s
also a new test suite helper for libraries targeting the UHI indexing spec.&lt;/p&gt;</description></item><item><title>pybind11 3.0.0</title><link>https://iscinumpy.dev/post/pybind11-3-0-0/</link><pubDate>Thu, 10 Jul 2025 00:13:00 -0400</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author><guid>https://iscinumpy.dev/post/pybind11-3-0-0/</guid><description>&lt;figure class="transparent"&gt;
 &lt;img src="https://iscinumpy.dev/post/pybind11-2-6-0/images/pybind11-logo.png" alt="pybind11 logo" width="405" /&gt;
&lt;/figure&gt;


&lt;p&gt;Pybind11 3.0 has been released! I would like to highlight some of the key
changes below; be sure to check out the &lt;a href="https://pybind11.readthedocs.io/en/latest/changelog.html"&gt;changelog&lt;/a&gt; and &lt;a href="https://pybind11.readthedocs.io/en/latest/upgrade.html"&gt;upgrade guide&lt;/a&gt; for
more information! This release includes an ABI bump, the first required bump in
many years on Unix (Windows has had required bumps more often). This release
contains the multi-year smart-holder branch, multi-phase init and subinterpreter
support, &lt;code&gt;py::native_enum&lt;/code&gt;, an interface to warnings, typing improvements, and
more. CMake now defaults to &lt;a href="https://cmake.org/cmake/help/latest/module/FindPython.html"&gt;FindPython&lt;/a&gt; mode.&lt;/p&gt;
&lt;p&gt;Support for Python 3.14, 3.14t, GraalPy, PyPy 3.11, and iOS have been added,
while legacy support for Python 3.7, PyPy 3.8/3.9, and CMake &amp;lt;3.15 has been
removed. Most deprecated features have been kept for this release, but anything
producing a warning in 3.0 may be removed in a future 3.x version.&lt;/p&gt;</description></item><item><title>🎡 cibuildwheel 3.0</title><link>https://iscinumpy.dev/post/cibuildwheel-3-0-0/</link><pubDate>Thu, 05 Jun 2025 01:54:45 -0400</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author><guid>https://iscinumpy.dev/post/cibuildwheel-3-0-0/</guid><description>&lt;p&gt;&lt;a href="https://cibuildwheel.pypa.io"&gt;cibuildwheel&lt;/a&gt; 3.0.0 is out, with some very big additions. We&amp;rsquo;ve added
GraalPy, Python 3.14 (and 3.14t) betas, and iOS support! We&amp;rsquo;ve got several new
options: &lt;code&gt;test-sources&lt;/code&gt;, &lt;code&gt;test-environment&lt;/code&gt;, and (experimental)
&lt;code&gt;pyodide-version&lt;/code&gt;. We now fully use &lt;code&gt;enable&lt;/code&gt; (and PyPy requires using it), and
we no longer inject setuptools and wheel in build environments. Defaults have
changed, too: &lt;code&gt;build&lt;/code&gt; is now the default frontend, &lt;code&gt;manylinux_2_28&lt;/code&gt; is the
default manylinux image, with 32-bit linux now being opt-in. We&amp;rsquo;ve removed
support for Python 3.6 and 3.7, we now require 3.11+ to run cibuildwheel itself,
and EoL manylinux/musllinux images now need to be fully specified.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ve had some fantastic releases of cibuildwheel since my last post over 2.19,
so I&amp;rsquo;ll include a few of the new features from those releases, too. I&amp;rsquo;ll also
note a few of the features being worked on for future releases.&lt;/p&gt;</description></item><item><title>Python π</title><link>https://iscinumpy.dev/post/python-314/</link><pubDate>Thu, 08 May 2025 09:05:54 -0400</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author><guid>https://iscinumpy.dev/post/python-314/</guid><description>&lt;p&gt;Python π (3.14) is out! The big feature this time around is template strings.
Free-threading is no longer experimental. There&amp;rsquo;s also lots more color
(including syntax highlighting in the REPL!), remote debugging, deferred
evaluation of annotations, and the usual error message and performance
improvements. Subinterpreters are now accessible without the C-API (finally!),
and free-threaded Python is no longer experimental.&lt;/p&gt;</description></item><item><title>scikit-build-core 0.10</title><link>https://iscinumpy.dev/post/scikit-build-core-0-10/</link><pubDate>Mon, 05 Aug 2024 23:09:13 -0400</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author><guid>https://iscinumpy.dev/post/scikit-build-core-0-10/</guid><description>&lt;p&gt;Scikit-build-core 0.10 is out, and it is one of the largest releases we&amp;rsquo;ve
produced in terms of new configuration options. It automatically reads your
minimum CMake version, you can tell it to read your scikit-build-core
minimum-version, and there are settings for many of the advanced things users
used to do with scikit-build (classic), like rebuilds or pure Python fallbacks
on build failures.&lt;/p&gt;</description></item><item><title>🎡 cibuildwheel 2.19</title><link>https://iscinumpy.dev/post/cibuildwheel-2-19-0/</link><pubDate>Mon, 10 Jun 2024 12:05:51 -0400</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author><guid>https://iscinumpy.dev/post/cibuildwheel-2-19-0/</guid><description>&lt;p&gt;&lt;a href="https://cibuildwheel.pypa.io"&gt;cibuildwheel&lt;/a&gt; 2.19 is out, with some very big additions. A new platform,
&lt;a href="https://pyodide.org"&gt;Pyodide&lt;/a&gt;, has been added for building WebAssembly wheels. We&amp;rsquo;ve added CPython
3.13 free-threaded builds, now on all OS&amp;rsquo;s. And we have an opt-in speed
improvement with the &lt;code&gt;build[uv]&lt;/code&gt; build-frontend option.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ve had some fantastic releases of cibuildwheel since my last post over 2.10,
so I&amp;rsquo;ll include a few of the new features from those releases, too, with a
highlight on a larger feature that can use more explaining: &lt;code&gt;inherit&lt;/code&gt; for
overrides.&lt;/p&gt;</description></item><item><title>Python 3.13</title><link>https://iscinumpy.dev/post/python-313/</link><pubDate>Thu, 09 May 2024 15:33:00 -0400</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author><guid>https://iscinumpy.dev/post/python-313/</guid><description>&lt;p&gt;Python 3.13 betas are out (Edit: 3.13.0 is out!), which means the features are
locked in. For the first time in thirty years, Python has a new, more colorful
REPL! There&amp;rsquo;s also a no-GIL compile-time option (free-threaded), an optional
JIT, some new typing features, and better error messages (again).&lt;/p&gt;</description></item><item><title>Inline run dependencies in pipx 1.4.2</title><link>https://iscinumpy.dev/post/pep723/</link><pubDate>Mon, 04 Dec 2023 15:00:06 -0500</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author><guid>https://iscinumpy.dev/post/pep723/</guid><description>&lt;p&gt;While it can also do much more, Python is a fantastic language for writing small
scripts and utilities with its expressive syntax and batteries-included standard
library. But what if you need just a bit more? PyPI is one of the best package
repositories for any language, and being able to access it &lt;em&gt;without&lt;/em&gt; having to
write a multi-file library and setting up virtual environments would be a
dream - one that is becoming reality. Pipx 1.4.2 has an experimental
implementation of the &lt;del&gt;provisionally&lt;/del&gt; accepted &lt;a href="https://peps.python.org/pep-0723"&gt;PEP 723&lt;/a&gt;, and I&amp;rsquo;d like to
show it off here, as it&amp;rsquo;s tremendously useful for simple scripts &amp;amp; utilities.
Support is also available in Nox 2024.04.15 and Hatch 1.10.&lt;/p&gt;</description></item><item><title>The Scientific Python Development Guide</title><link>https://iscinumpy.dev/post/cookie/</link><pubDate>Fri, 14 Jul 2023 00:45:32 -0500</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author><guid>https://iscinumpy.dev/post/cookie/</guid><description>&lt;p&gt;One outcome of the
&lt;a href="https://scientific-python.org/summits/developer/2023/"&gt;2023 Scientific Python Developer Summit&lt;/a&gt;
was the &lt;a href="https://learn.scientific-python.org/development"&gt;Scientific Python Development Guide&lt;/a&gt;, a comprehensive guide to modern
Python package development, complete with a &lt;a href="https://github.com/scientific-python/cookie"&gt;new project template&lt;/a&gt;
supporting 12 build backends and a &lt;a href="https://learn.scientific-python.org/development/guides/repo-review"&gt;WebAssembly-powered checker&lt;/a&gt;
with checks linked to the guide. The guide covers topics like &lt;a href="https://learn.scientific-python.org/development/guides/packaging-simple/"&gt;modern&lt;/a&gt;,
&lt;a href="https://learn.scientific-python.org/development/guides/packaging-compiled/"&gt;compiled&lt;/a&gt;, and &lt;a href="https://learn.scientific-python.org/development/guides/packaging-classic/"&gt;classic&lt;/a&gt; packaging, &lt;a href="https://learn.scientific-python.org/development/guides/style/"&gt;style&lt;/a&gt; checks, &lt;a href="https://learn.scientific-python.org/development/guides/mypy/"&gt;type
checking&lt;/a&gt;, &lt;a href="https://learn.scientific-python.org/development/guides/docs/"&gt;docs&lt;/a&gt;, &lt;a href="https://learn.scientific-python.org/development/guides/tasks/"&gt;task runners&lt;/a&gt;, &lt;a href="https://learn.scientific-python.org/development/guides/gha-basic/"&gt;CI&lt;/a&gt;, &lt;a href="https://learn.scientific-python.org/development/guides/pytest/"&gt;tests&lt;/a&gt;,
and much more! There also are sections of &lt;a href="https://learn.scientific-python.org/development/tutorials/"&gt;tutorials&lt;/a&gt;, &lt;a href="https://learn.scientific-python.org/development/principles/"&gt;principles&lt;/a&gt;, and
some common &lt;a href="https://learn.scientific-python.org/development/patterns/"&gt;patterns&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This guide (along with cookie &amp;amp; repo-review) started in &lt;a href="https://scikit-hep.org"&gt;Scikit-HEP&lt;/a&gt; in 2020.
During the summit, it was merged with the &lt;a href="https://nsls-ii.github.io/"&gt;NSLS-II&lt;/a&gt; guidelines, which provided
the basis for the &lt;a href="https://learn.scientific-python.org/development/principles/"&gt;principles&lt;/a&gt; section. I&amp;rsquo;d like to thank and acknowledge Dan
Allan and Gregory Lee for working tirelessly during the summit to rework,
rewrite, merge, and fix the guide, including writing most of the &lt;a href="https://learn.scientific-python.org/development/tutorials/"&gt;tutorials&lt;/a&gt;
pages and first &lt;a href="https://learn.scientific-python.org/development/patterns/"&gt;patterns&lt;/a&gt; page, and rewriting the &lt;a href="https://learn.scientific-python.org/development/tutorials/dev-environment/"&gt;environment&lt;/a&gt; page as a
tutorial.&lt;/p&gt;</description></item><item><title>Introducing repo-review</title><link>https://iscinumpy.dev/post/repo-review/</link><pubDate>Thu, 13 Jul 2023 22:00:00 -0400</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author><guid>https://iscinumpy.dev/post/repo-review/</guid><description>&lt;p&gt;I&amp;rsquo;ve released a new&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt; toolkit for running checks, similar to Ruff and Flake8
but designed to check configuration, called &lt;a href="https://repo-review.readthedocs.io"&gt;repo-review&lt;/a&gt;. It requires Python
3.10+&lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref"&gt;2&lt;/a&gt;&lt;/sup&gt; to run and has no built-in checks, but is easy to write plugins for. A
set of checks based on the &lt;a href="https://learn.scientific-python.org/development"&gt;Scientific Python Development Guide&lt;/a&gt; (which I also
&lt;a href="https://iscinumpy.dev/post/cookie"&gt;have a post about&lt;/a&gt;!) are available as a plugin, &lt;code&gt;sp-repo-review&lt;/code&gt;.
You can run &lt;code&gt;repo-review&lt;/code&gt; in WebAssembly (via Pyodide), or in pre-commit, or as
a GitHub Action. It supports multiple output formats, including Rich, HTML, and
JSON. The system is based on fixtures (like pytest) and topologically sorts
requirements. You don&amp;rsquo;t need to depend on repo-review to add a repo-review
plugin. You can see a live version using sp-repo-review
&lt;a href="https://learn.scientific-python.org/development/guides/repo-review/"&gt;in-place here&lt;/a&gt;
or &lt;a href="https://scientific-python.github.io/repo-review/"&gt;standalone here&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Python 3.12</title><link>https://iscinumpy.dev/post/python-312/</link><pubDate>Mon, 19 Jun 2023 17:00:00 -0400</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author><guid>https://iscinumpy.dev/post/python-312/</guid><description>&lt;p&gt;Python 3.12&amp;rsquo;s beta&amp;rsquo;s are out, which means the features are locked in. The theme
this year has been cleanup and typing. &lt;code&gt;distutils&lt;/code&gt; has been removed, and
setuptools is no longer present in default environments.&lt;/p&gt;</description></item><item><title>🎡 cibuildwheel 2.10</title><link>https://iscinumpy.dev/post/cibuildwheel-2-10-0/</link><pubDate>Tue, 13 Sep 2022 08:42:26 -0400</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author><guid>https://iscinumpy.dev/post/cibuildwheel-2-10-0/</guid><description>&lt;p&gt;&lt;a href="https://github.com/pypa/cibuildwheel"&gt;cibuildwheel&lt;/a&gt; 2.10 is out, with some important additions. PEP 517 config
settings added, &lt;code&gt;--only&lt;/code&gt; (which has an interesting use in GHA), and Cirrus CI
support (including our first Apple Silicon native runner!) are highlights. We
also support Python 3.11 now (as of 2.11.2, RC&amp;rsquo;s in older releases).&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ve had some fantastic releases of cibuildwheel this year, including some very
powerful features you might be interested in using, and I haven&amp;rsquo;t covered
releases since 2.2, so let&amp;rsquo;s take an in-depth look at what&amp;rsquo;s new for this and
the last few releases!&lt;/p&gt;</description></item><item><title>Python 3.10</title><link>https://iscinumpy.dev/post/python-310/</link><pubDate>Sat, 23 Jul 2022 10:00:00 -0400</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author><guid>https://iscinumpy.dev/post/python-310/</guid><description>&lt;p&gt;Python 3.10 is out (and has been for a while, I&amp;rsquo;m late posting this), with new
features and changes. The big new language feature this update is pattern
matching. We get much better errors, the always-present typing improvements, and
finally some real usage of the new PEG parser from 3.9.&lt;/p&gt;</description></item><item><title>Python 3.11</title><link>https://iscinumpy.dev/post/python-311/</link><pubDate>Wed, 11 May 2022 16:11:00 -0400</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author><guid>https://iscinumpy.dev/post/python-311/</guid><description>&lt;p&gt;Python 3.11 has hit the beta (now released!) stage, which means no more new
features. It&amp;rsquo;s a perfect time to play with it! The themes in this update are the
standard ones: The faster CPython project is now fully going (3.11 is 25% faster
on average), along with improved error messages, typing, and asyncio. Beyond
this, the only major new feature is a library for reading TOML files; this this
is probably only exciting if you are involved in Python packaging (but I am, so
I&amp;rsquo;m excited!).&lt;/p&gt;</description></item><item><title>Python 3.7</title><link>https://iscinumpy.dev/post/python-37/</link><pubDate>Sat, 15 Jan 2022 22:41:05 -0500</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author><guid>https://iscinumpy.dev/post/python-37/</guid><description>&lt;p&gt;Python 3.7 has been out for a while. In fact, it&amp;rsquo;s the oldest version of Python
still receiving support when this was written. I&amp;rsquo;d still like to write a &amp;ldquo;what&amp;rsquo;s
new&amp;rdquo;, targeting users who are upgrading to a Python 3.7+ only codebase, and want
to know what to take advantage of!&lt;/p&gt;</description></item><item><title>Poetry Versions</title><link>https://iscinumpy.dev/post/poetry-versions/</link><pubDate>Thu, 09 Dec 2021 11:00:00 -0500</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author><guid>https://iscinumpy.dev/post/poetry-versions/</guid><description>&lt;p&gt;&lt;a href="https://python-poetry.org"&gt;Poetry&lt;/a&gt; provides an all-in-one solution to Python packaging. I want to focus
on why I was quite hard on Poetry in my last post, specifically on its default
version capping and solver quirks, and also a few other negative things. This is
a followup to
&lt;a href="https://iscinumpy.dev/post/bound-version-constraints"&gt;Should you have upper version bounds&lt;/a&gt;, which
you should read before this post.&lt;/p&gt;</description></item><item><title>Should You Use Upper Bound Version Constraints?</title><link>https://iscinumpy.dev/post/bound-version-constraints/</link><pubDate>Thu, 09 Dec 2021 10:00:00 -0500</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author><guid>https://iscinumpy.dev/post/bound-version-constraints/</guid><description>&lt;p&gt;Bound version constraints (upper caps) are starting to show up in the Python
ecosystem. This is causing &lt;a href="https://github.com/scikit-hep/pyhf/discussions/1595"&gt;real world problems&lt;/a&gt; with
libraries following this recommendation, and is likely to &lt;a href="https://github.com/pypa/packaging/pull/482#issuecomment-963030131"&gt;continue to get
worse&lt;/a&gt;; this practice does not scale to large numbers
of libraries or large numbers of users. In this discussion I would like to
explain why &lt;em&gt;always&lt;/em&gt; providing an upper limit causes far more harm than good
&lt;em&gt;even for true SemVer libraries&lt;/em&gt;, why libraries that pin upper limits require
&lt;em&gt;more frequent&lt;/em&gt; updates rather than less, and why it is not scalable. After
reading this, hopefully you will always consider every cap you add, you will
know the (few) places where pinning an upper limit is reasonable, and will
possibly even avoid using libraries that pin upper limits needlessly until the
author updates them to remove these pins.&lt;/p&gt;
&lt;p&gt;If this 10,000 word behemoth is a bit long for you, then skip around using the
table of contents, or see the &lt;a href="#tldr"&gt;TL;DR&lt;/a&gt; section at the end, or read
&lt;a href="https://bernat.tech/posts/version-numbers"&gt;version numbers by Bernát Gábor&lt;/a&gt;, which is shorter but is a
fantastic read with good examples and cute dog pictures. Or
&lt;a href="https://hynek.me/articles/semver-will-not-save-you/"&gt;Hynek&amp;rsquo;s Semantic Versioning Will Not Save You&lt;/a&gt;
Be sure to check at least
&lt;a href="#analysis-of-a-javascript-project"&gt;the JavaScript project analysis&lt;/a&gt; before you
leave!&lt;/p&gt;
&lt;p&gt;Also be warned, I pick on &lt;a href="https://python-poetry.org"&gt;Poetry&lt;/a&gt; quite a bit. The rising popularity of
&lt;a href="https://python-poetry.org"&gt;Poetry&lt;/a&gt; is likely due to the simplicity of having one tool vs. many for
packaging, but it happens to also have a special dependency solver, a new upper
bound syntax, and a &lt;a href="https://python-poetry.org/docs/faq/#why-are-unbound-version-constraints-a-bad-idea"&gt;strong recommendation to always limit upper
versions&lt;/a&gt; - in direct opposition to &lt;a href="https://snarky.ca/why-i-dont-like-semver/"&gt;members of the
Python core developer team&lt;/a&gt; and PyPA developers. Not
all libraries with excessive version capping are Poetry projects (like
TensorFlow), but many, many of them are. To be clear, Poetry doesn&amp;rsquo;t force
version pinning on you, but it does push you really, really hard to always
version cap, and it&amp;rsquo;s targeting new Python users that don&amp;rsquo;t know any better yet
than to accept bad recommendations. And these affect the whole ecosystem,
including users who do not use poetry, but want to depend on libraries that do!
I do really like other aspects of Poetry, and would like to
&lt;a href="https://iscinumpy.dev/post/scikit-build-proposal"&gt;eventually&lt;/a&gt; help it build binary packages with Scikit-build
(CMake) via a plugin, and it has some great developers. If I don&amp;rsquo;t pick on
Poetry enough for you, don&amp;rsquo;t worry, I have a
&lt;a href="https://iscinumpy.dev/post/poetry-versions"&gt;follow-up post&lt;/a&gt; that picks on it in much more detail.
Also, check out &lt;a href="https://pdm.fming.dev"&gt;pdm&lt;/a&gt;, which gives many of the benefits of Poetry while
following PEP standards. Also &lt;a href="https://pixi.sh"&gt;pixi&lt;/a&gt;, which works with the Conda ecosystem.&lt;/p&gt;
&lt;p&gt;If you come across something that can&amp;rsquo;t be solved, try using
&lt;code&gt;--exclude-newer &amp;lt;DATE&amp;gt;&lt;/code&gt; in &lt;a href="https://github.com/astral-sh/uv"&gt;uv&lt;/a&gt; and &lt;a href="https://pdm.fming.dev"&gt;pdm&lt;/a&gt;. This limits the solve by
ignoring packages newer than some date.&lt;/p&gt;
&lt;!-- prettier-ignore-start --&gt;
&lt;!-- prettier-ignore-end --&gt;</description></item><item><title>App vs Library</title><link>https://iscinumpy.dev/post/app-vs-library/</link><pubDate>Thu, 09 Dec 2021 09:00:00 -0500</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author><guid>https://iscinumpy.dev/post/app-vs-library/</guid><description>&lt;p&gt;What is the difference between an app and a library? This seemingly simple
question confuses some, and it turns out to be a harder question to answer than
you might expect. While the actual distinction between these common terms will
always be muddled in practice, I propose a specific definition to be used when
considering dependencies. This distinction is important when
&lt;a href="https://iscinumpy.dev/post/bound-version-constraints"&gt;discussing bound version constraints&lt;/a&gt; in the
next post.&lt;/p&gt;</description></item><item><title>Scikit Build Proposal</title><link>https://iscinumpy.dev/post/scikit-build-proposal/</link><pubDate>Wed, 27 Oct 2021 08:00:00 -0400</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author><guid>https://iscinumpy.dev/post/scikit-build-proposal/</guid><description>&lt;p&gt;I&amp;rsquo;ve spent the last few years trying to make it easy for anyone to extend Python
with compiled languages. I&amp;rsquo;ve worked on &lt;a href="https://github.com/pybind/pybind11"&gt;pybind11&lt;/a&gt;, a powerful C++ library
that allows users to write advanced Python extensions using just C++11, used by
some of the largest projects, SciPy, PyTorch, Google, LLVM, and tens of
thousands of other libraries, down to very small extensions. I also work on
&lt;a href="https://github.com/pypa/cibuildwheel"&gt;cibuildwheel&lt;/a&gt;, which makes building binaries (called wheels) on continuous
integration (CI) simple. It is again powerful enough to be used by huge
projects, like Scikit-learn, matplotlib, mypy; and is simple enough to be used
by hundreds of other packages. Recently it was accepted into the Python
Packaging Authority (PyPA). There is one missing piece, though, to complete this
picture of compiled extensions that is easy to use for small projects, and
powerful enough for large projects: the build system. I believe the solution to
that is &lt;a href="https://github.com/scikit-build/scikit-build"&gt;scikit-build&lt;/a&gt;, and I&amp;rsquo;d like to work on it over the next three years.&lt;/p&gt;
&lt;p&gt;Scikit-build is a tool for integrating a package with a CMake build system into
Python. You can utilize the vast collection of packages and projects using CMake
already, and you have access to modern building features, like multithreaded
builds, library discovery, superb compiler and IDE support, and all sorts of
extended tooling. Modern CMake is quite pleasant to write compared to times
past; I have written &lt;a href="https://cliutils.gitlab.io/modern-cmake/"&gt;a book&lt;/a&gt; and &lt;a href="https://hsf-training.github.io/hsf-training-cmake-webpage"&gt;training course&lt;/a&gt; on it. We
ship up-to-date &lt;code&gt;cmake&lt;/code&gt; and &lt;code&gt;ninja&lt;/code&gt; wheels for all binary platforms.&lt;/p&gt;
&lt;p&gt;Update: Funded! I&amp;rsquo;ll be working on this starting August 1, 2022!&lt;/p&gt;
&lt;p&gt;I wrote a proposal for an NSF CSSI Elements project containing three parts. The
first part will cover core development on Scikit-build to address the current
shortcomings and to prepare it for a post-distutils (Python 3.12+) world. The
second part would cover assisting libraries with a science use case in either
transitioning to scikit-build (ideally from an existing CMake build system with
Python bindings, but I can help mentor developers in writing bindings (ideally
pybind11), setting up CI, and writing CMake code as well (see my book or
workshop on Modern CMake, and I&amp;rsquo;m happy to help old scikit-build projects
transition to better practices)). As part of this, I would be building up the
examples and documentation, leading into the third part of the proposal: A
series of training events and training material, including plans for something
alongside SciPy.&lt;/p&gt;
&lt;p&gt;You can also see an outline at
&lt;a href="https://github.com/scikit-build/scikit-build/wiki"&gt;scikit-build/scikit-build/wiki&lt;/a&gt;
or at the end of this post.&lt;/p&gt;
&lt;p&gt;Thank you for all the projects! The proposal was submitted Dec 8, 2021; mid year
we should find out if it was accepted!&lt;/p&gt;</description></item><item><title>🎡 cibuildwheel 2.2</title><link>https://iscinumpy.dev/post/cibuildwheel-2-2-0/</link><pubDate>Wed, 20 Oct 2021 11:27:29 -0400</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author><guid>https://iscinumpy.dev/post/cibuildwheel-2-2-0/</guid><description>&lt;p&gt;Another great release from &lt;a href="https://cibuildwheel.readthedocs.io"&gt;cibuildwheel&lt;/a&gt;, &lt;a href="https://github.com/pypa/cibuildwheel/releases/tag/v2.2.0"&gt;2.2.0&lt;/a&gt;, is out! There are a few
important additions in this release that you should be aware of, so I will
outline the major changes here. We will cover the new musllinux wheels, overload
configuration, and incoming changes to pip and PyPy expected in the next
release. As always, it is recommended that you pin your cibuildwheel version and
then provide some automated way to keep the pin up-to-date, such as GitHub&amp;rsquo;s
dependabot. You should be updating just before you make a release, as well, but
you probably don&amp;rsquo;t want to be surprised by new wheels during your release
process!&lt;/p&gt;</description></item><item><title>🎡 cibuildwheel 2.0</title><link>https://iscinumpy.dev/post/cibuildwheel-2-0/</link><pubDate>Fri, 16 Jul 2021 12:23:20 -0400</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author><guid>https://iscinumpy.dev/post/cibuildwheel-2-0/</guid><description>&lt;p&gt;The &lt;a href="https://cibuildwheel.readthedocs.io"&gt;cibuildwheel&lt;/a&gt; package has just had a major release with some fantastic
features. Python 2.7 and 3.5 support has been removed (and PyPy3.6), allowing us
to update to the latest manylinux and auditwheel versions, and support the newly
unified manylinux PyPy3.7 images. We now allow users to select &lt;code&gt;pypa/build&lt;/code&gt; as a
build frontend. We now have a custom option to enable pre-release Pythons (3.10
currently) for testing before they are ABI stable (please don&amp;rsquo;t release wheels
until that happens). Maybe most exciting, cibuildwheel now supports
configuration in &lt;code&gt;pyproject.toml&lt;/code&gt;, allowing you to be even further isolated from
dependence on your CI system; you can easily produce Linux and Windows wheels
locally (macOS still installs to system locations). And, since my
&lt;a href="https://iscinumpy.dev/post/cibuildwheel-1-9-0"&gt;last post&lt;/a&gt; and
&lt;a href="https://iscinumpy.dev/post/overview-of-cibuildwheel"&gt;introduction post&lt;/a&gt;, cibuildwheel is now part of
the PyPA!&lt;/p&gt;</description></item><item><title>Python 3.9</title><link>https://iscinumpy.dev/post/python-39/</link><pubDate>Fri, 12 Feb 2021 12:00:00 -0400</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author><guid>https://iscinumpy.dev/post/python-39/</guid><description>&lt;p&gt;Python 3.9 is out (and has been for a while, I&amp;rsquo;m late posting this), with new
features and changes. The themes for this release have been heavily internal
improvements, such as a new more powerful parser, and the usual static typing
improvements, along with a several bits new-user facing new syntax. This makes
3.9 a smaller release, but still it has some nice features of note.&lt;/p&gt;</description></item><item><title>🎡 cibuildwheel 1.8.0 and 1.9.0</title><link>https://iscinumpy.dev/post/cibuildwheel-1-9-0/</link><pubDate>Sun, 07 Feb 2021 20:13:41 -0500</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author><guid>https://iscinumpy.dev/post/cibuildwheel-1-9-0/</guid><description>&lt;p&gt;&lt;a href="https://cibuildwheel.readthedocs.io"&gt;&lt;code&gt;cibuildwheel&lt;/code&gt;&lt;/a&gt; has just had two back-to-back releases, two weeks apart,
representing several months of hard work and a few exciting features! I will be
covering both releases at once, so we will discuss Apple Silicon support,
architecture emulation on Linux, integrated PEP 621 Requires-Python support, the
native GitHub Action, extended build and test controls, and more!&lt;/p&gt;
&lt;p&gt;If you are following the releases, 1.7.0 came out last November (2020), and
included the fantastic output folding feature, which makes logs much easier to
read on CI systems that support folding, and makes it much easier to see how
long each step takes. The 1.7.x series also included the addition of the
&lt;a href="https://cibuildwheel.readthedocs.io/en/stable/working-examples/"&gt;working examples section&lt;/a&gt; of the documentation, which tracks
some known projects using &lt;code&gt;cibuildwheel&lt;/code&gt;, such as scikit-learn, Matplotlib, and
MyPy; it is a great place to go to look into how other projects have integrated
&lt;a href="https://cibuildwheel.readthedocs.io"&gt;&lt;code&gt;cibuildwheel&lt;/code&gt;&lt;/a&gt; into their workflow.&lt;/p&gt;
&lt;p&gt;I have a &lt;a href="https://iscinumpy.dev/post/overview-of-cibuildwheel"&gt;general overview post&lt;/a&gt; as well. Now
let&amp;rsquo;s look at what&amp;rsquo;s new! Update: cibuildwheel is now an official package of the
PyPA!&lt;/p&gt;</description></item><item><title>Overview of cibuildwheel 🎡</title><link>https://iscinumpy.dev/post/overview-of-cibuildwheel/</link><pubDate>Sat, 06 Feb 2021 20:58:16 -0500</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author><guid>https://iscinumpy.dev/post/overview-of-cibuildwheel/</guid><description>&lt;p&gt;This is the first of two posts on &lt;a href="https://cibuildwheel.readthedocs.io"&gt;&lt;code&gt;cibuildwheel&lt;/code&gt;&lt;/a&gt;, a fantastic project I
joined after switching to it from my own &lt;a href="https://github.com/scikit-hep/azure-wheel-helpers"&gt;azure-wheel-helpers&lt;/a&gt;, which I&amp;rsquo;ve
blogged about &lt;a href="https://iscinumpy.dev/post/azure-devops-python-wheels/"&gt;here before&lt;/a&gt;. It is the best wheelbuilding
system available for Python today, and can make something that is normally a
pain to setup and a headache to maintain a breeze (by forcing all the headaches
on us, of course, as maintainers, but it&amp;rsquo;s better to solve issues centrally!
Obviously we rather like solving these problems. Or we are just crazy, which is
also possible ;) ).&lt;/p&gt;
&lt;p&gt;Be sure to checkout
&lt;a href="https://iscinumpy.dev/post/cibuildwheel-1-9-0"&gt;the followup post over new features in 1.8.0 and 1.9.0&lt;/a&gt;,
too! Also, &lt;code&gt;cibuildwheel&lt;/code&gt; was recently accepted into the PyPA!&lt;/p&gt;</description></item><item><title>pybind11 2.6.0</title><link>https://iscinumpy.dev/post/pybind11-2-6-0/</link><pubDate>Wed, 21 Oct 2020 15:00:00 -0400</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author><guid>https://iscinumpy.dev/post/pybind11-2-6-0/</guid><description>&lt;figure class="transparent"&gt;
 &lt;img src="https://iscinumpy.dev/post/pybind11-2-6-0/images/pybind11-logo.png" alt="pybind11 logo" width="405" /&gt;
&lt;/figure&gt;


&lt;p&gt;I am pleased to announce the release of &lt;a href="https://github.com/pybind/pybind11/releases/tag/v2.6.0"&gt;pybind11 2.6.0&lt;/a&gt;! This is the largest
release since 2.2 (released over three years ago). I would like to highlight
some of the key changes below; be sure to check out the &lt;a href="https://pybind11.readthedocs.io/en/latest/changelog.html"&gt;changelog&lt;/a&gt; and
&lt;a href="https://pybind11.readthedocs.io/en/latest/upgrade.html"&gt;upgrade guide&lt;/a&gt; for more information! The focus of this release was stability,
packaging, and supporting more platforms, though there are a lot of small
features and useful additions, covered by &lt;a href="https://pybind11.readthedocs.io"&gt;newly expanded docs&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Johns Hopkins COVID-19 Dataset in Pandas</title><link>https://iscinumpy.dev/post/johns-hopkins-covid/</link><pubDate>Mon, 30 Mar 2020 15:30:00 -0400</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author><guid>https://iscinumpy.dev/post/johns-hopkins-covid/</guid><description>&lt;p&gt;COVID-19 is ravaging the globe. Let&amp;rsquo;s look at the excellent Johns Hopkins
dataset using Pandas. This will serve both as a guideline for getting the data
and exploring on your own, as well as an example of Pandas multi-indexing in an easy
to understand situation. I am currently involved in &lt;a href="https://science-responds.org"&gt;science-responds&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>The boost-histogram beta release</title><link>https://iscinumpy.dev/post/boost-histogram-06/</link><pubDate>Fri, 13 Dec 2019 11:00:00 -0500</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author><guid>https://iscinumpy.dev/post/boost-histogram-06/</guid><description>&lt;figure class="transparent"&gt;
 &lt;img src="https://iscinumpy.dev/post/boost-histogram-06/images/BoostHistogramPythonLogo.png" alt="boost-histogram logo" width="405" /&gt;
&lt;/figure&gt;


&lt;p&gt;The foundational histogramming package for Python, &lt;a href="https://github.com/scikit-hep/boost-histogram"&gt;boost-histogram&lt;/a&gt;, hit beta
status with version 0.6! This is a major update to the new &lt;a href="https://github.com/boostorg/histogram"&gt;Boost.Histogram&lt;/a&gt;
bindings. Since I have not written about boost-histogram yet here, I will
introduce the library in its current state. Version 0.6.2 was based on the
recently released &lt;a href="https://www.boost.org"&gt;Boost C++ Libraries&lt;/a&gt; &lt;a href="https://www.boost.org/users/history/version_1_72_0.html"&gt;1.72&lt;/a&gt; Histogram
package. Feel free to &lt;a href="https://boost-histogram.readthedocs.io/en/latest/"&gt;visit the docs&lt;/a&gt;, or keep reading
this post.&lt;/p&gt;
&lt;p&gt;This Python library is part of a larger picture in the &lt;a href="https://scikit-hep.org"&gt;Scikit-HEP&lt;/a&gt; ecosystem
of tools for Particle Physics and is funded by &lt;a href="https://diana-hep.org"&gt;DIANA/HEP&lt;/a&gt; and &lt;a href="https://iris-hep.org"&gt;IRIS-HEP&lt;/a&gt;.
It is the core library for making and manipulating histograms. Other packages
are under development to provide a complete set of tools to work with and
visualize histograms. The &lt;a href="https://github.com/scikit-hep/aghast"&gt;Aghast&lt;/a&gt; package is designed to convert between
popular histogram formats, and the Hist package will be designed to make common
analysis tasks simple, like plotting via tools such as the &lt;a href="https://github.com/scikit-hep/mplhep"&gt;mplhep&lt;/a&gt; package.
Hist and Aghast will be initially driven by HEP (High Energy Physics and
Particle Physics) needs, but outside issues and contributions are welcome and
encouraged.&lt;/p&gt;</description></item><item><title>Python 3.8</title><link>https://iscinumpy.dev/post/python-38/</link><pubDate>Fri, 25 Oct 2019 14:11:20 -0400</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author><guid>https://iscinumpy.dev/post/python-38/</guid><description>&lt;p&gt;Python 3.8 is out, with new features and changes. The themes for this release
have been performance, ABI/internals, and static typing, along with a smattering
of new syntax. Given the recent
&lt;a href="https://numpy.org/neps/nep-0029-deprecation_policy.html"&gt;community statement on Python support&lt;/a&gt;,
we should be staying up to date with the current changes in Python. As Python 2
sunsets, we are finally in an era where we can hope to someday use the features
we see coming out of Python release again!&lt;/p&gt;</description></item><item><title>ROOT on Conda Forge</title><link>https://iscinumpy.dev/post/root-conda/</link><pubDate>Wed, 13 Feb 2019 10:18:37 +0100</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author><guid>https://iscinumpy.dev/post/root-conda/</guid><description>&lt;p&gt;For High Energy Physics, the go-to framework for big data analysis has been
CERN&amp;rsquo;s &lt;a href="https://root.cern"&gt;ROOT&lt;/a&gt; framework. ROOT is a massive C++ library that even predates the
STL in some areas. It is&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt; &lt;em&gt;also&lt;/em&gt; a JIT C++ interpreter called Cling, probably
the best in the business. If you have
&lt;a href="https://andersy005.github.io/blog/2018/01/20/play-interactively-with-cpp-getting-started-with-xeus-cling/"&gt;heard of&lt;/a&gt;
the &lt;a href="https://github.com/QuantStack/xeus-cling"&gt;Xeus&lt;/a&gt; C++ Kernel for Jupyter, that is built on top of Cling. ROOT has
everything a HEP physicist could want: math, plotting, histograms, tuple and
tree structures, a very powerful file format for IO, machine learning, Python
bindings, and more. It also does things like dictionary generation and arbitrary
class serialization (other large frameworks like &lt;a href="https://qt.io"&gt;Qt&lt;/a&gt; have similar generation
tools).&lt;/p&gt;
&lt;p&gt;You may already be guessing one of the most common problems for ROOT. It is huge
and difficult to install &amp;ndash; if you build from source, that&amp;rsquo;s a several hour task
on a single core. It has gotten &lt;a href="https://root.cern/install/"&gt;much better&lt;/a&gt; in the
last 6 years, and there are several places you can find ROOT, but there are
still areas where it is challenging. This is especially true for Python; ROOT is
linked to your distro&amp;rsquo;s Python (both python2 and python3 if your distro supports
it, as of ROOT 6.22); but the common rule for using Python is &amp;ldquo;don&amp;rsquo;t touch your
system Python&amp;rdquo; - so modern Python users should be in a virtual environment, and
for that ROOT requires the system site-packages option be enabled, which is not
always ideal. And, if you use the &lt;a href="https://www.anaconda.com/distribution/"&gt;Anaconda Python distribution&lt;/a&gt;,
which is the most popular scientific distribution of Python and massively
successful for ML frameworks, the general rule even for people who build ROOT
themselves has been: don&amp;rsquo;t. But now, you can get a fully featured ROOT binary
package for macOS or Linux, Python 2.7, 3.6, 3.7, or 3.8 from &lt;a href="https://conda-forge.org"&gt;Conda-Forge&lt;/a&gt;,
the most popular Anaconda community channel! Many more HEP recipes have now been
added to Conda-Forge, as well! ROOT now also provides a &lt;a href="https://root.cern/new-docker-images/"&gt;conda docker image&lt;/a&gt;,
too!&lt;/p&gt;</description></item><item><title>ROOT Install Options</title><link>https://iscinumpy.dev/post/root-install/</link><pubDate>Mon, 04 Feb 2019 10:44:37 +0100</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author><guid>https://iscinumpy.dev/post/root-install/</guid><description>&lt;p&gt;For particle physicists, ROOT is one of the most important toolkits around. It
is a huge suite of tools that predates the C++ standard library, and has almost
anything a particle physicist could want. It has driven developments in other
areas too. ROOT&amp;rsquo;s current C++ interpreter, CLING, is the most powerful C++
interpreter available and is used by the Xeus project for Jupyter. The Python
work has helped PyPy, with CPPYY also coming from ROOT. However, due to the
size, complexity, and age of some parts of ROOT, it can be a bit challenging to
install; and it is even more challenging when you want it to talk to Python. I
would like to point to the brand-new Conda-Forge ROOT package for Linux and
macOS, and point out a few other options for macOS installs. Note for Windows
users: Due to the fact that ROOT expects the type &lt;code&gt;long&lt;/code&gt; to match the system
pointer size, 64-bit Windows cannot be supported for quite some time. While you
can use it in 32 bit form, this is generally impossible to connect to Python,
which usually will be a 64-bit build.&lt;/p&gt;</description></item><item><title>Illustrations and videos</title><link>https://iscinumpy.dev/page/illustrations/</link><pubDate>Mon, 10 Dec 2018 11:32:00 +0100</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author><guid>https://iscinumpy.dev/page/illustrations/</guid><description>&lt;p&gt;These are some illustrations and videos that I have made over the years.&lt;/p&gt;</description></item><item><title>Histogram Speeds in Python</title><link>https://iscinumpy.dev/post/histogram-speeds-in-python/</link><pubDate>Thu, 01 Nov 2018 14:58:09 +0100</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author><guid>https://iscinumpy.dev/post/histogram-speeds-in-python/</guid><description>&lt;p&gt;Let&amp;rsquo;s compare several ways of making Histograms. I&amp;rsquo;m going to assume you would
like to end up with a nice OO histogram interface, so all the 2D methods will
fill a Physt histogram. We will be using a 2 x 1,000,000 element array and
filling a 2D histogram, or 10,000,000 elements in a 1D histogram. Binnings are
regular.&lt;/p&gt;
&lt;h2 id="1d-10000000-item-histogram"&gt;1D 10,000,000 item histogram&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Example&lt;/th&gt;
 &lt;th&gt;KNL&lt;/th&gt;
 &lt;th&gt;MBP&lt;/th&gt;
 &lt;th&gt;X24&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;NumPy: histogram&lt;/td&gt;
 &lt;td&gt;704 ms&lt;/td&gt;
 &lt;td&gt;147 ms&lt;/td&gt;
 &lt;td&gt;114 ms&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;NumPy: bincount&lt;/td&gt;
 &lt;td&gt;432 ms&lt;/td&gt;
 &lt;td&gt;110 ms&lt;/td&gt;
 &lt;td&gt;117 ms&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;fast-histogram&lt;/td&gt;
 &lt;td&gt;337 ms&lt;/td&gt;
 &lt;td&gt;45.9 ms&lt;/td&gt;
 &lt;td&gt;45.7 ms&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Numba&lt;/td&gt;
 &lt;td&gt;312 ms&lt;/td&gt;
 &lt;td&gt;58.8 ms&lt;/td&gt;
 &lt;td&gt;60.7 ms&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="2d-1000000-item-histogram"&gt;2D 1,000,000 item histogram&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Example&lt;/th&gt;
 &lt;th&gt;KNL&lt;/th&gt;
 &lt;th&gt;MBP&lt;/th&gt;
 &lt;th&gt;X24&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Physt&lt;/td&gt;
 &lt;td&gt;1.21 s&lt;/td&gt;
 &lt;td&gt;293 ms&lt;/td&gt;
 &lt;td&gt;246 ms&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;NumPy: histogram2d&lt;/td&gt;
 &lt;td&gt;456 ms&lt;/td&gt;
 &lt;td&gt;114 ms&lt;/td&gt;
 &lt;td&gt;88.3 ms&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;NumPy: add.at&lt;/td&gt;
 &lt;td&gt;247 ms&lt;/td&gt;
 &lt;td&gt;62.7 ms&lt;/td&gt;
 &lt;td&gt;49.7 ms&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;NumPy: bincount&lt;/td&gt;
 &lt;td&gt;81.7 ms&lt;/td&gt;
 &lt;td&gt;23.3 ms&lt;/td&gt;
 &lt;td&gt;20.3 ms&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;fast-histogram&lt;/td&gt;
 &lt;td&gt;53.7 ms&lt;/td&gt;
 &lt;td&gt;10.4 ms&lt;/td&gt;
 &lt;td&gt;7.31 ms&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;fast-hist threaded 0.5&lt;/td&gt;
 &lt;td&gt;(6) 62.5 ms&lt;/td&gt;
 &lt;td&gt;9.78 ms&lt;/td&gt;
 &lt;td&gt;(6) 15.4 ms&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;fast-hist threaded (m)&lt;/td&gt;
 &lt;td&gt;62.3 ms&lt;/td&gt;
 &lt;td&gt;4.89 ms&lt;/td&gt;
 &lt;td&gt;3.71 ms&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Numba&lt;/td&gt;
 &lt;td&gt;41.8 ms&lt;/td&gt;
 &lt;td&gt;10.2 ms&lt;/td&gt;
 &lt;td&gt;9.73 ms&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Numba threaded&lt;/td&gt;
 &lt;td&gt;(6) 49.2 ms&lt;/td&gt;
 &lt;td&gt;4.23 ms&lt;/td&gt;
 &lt;td&gt;(6) 4.12 ms&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Cython&lt;/td&gt;
 &lt;td&gt;112 ms&lt;/td&gt;
 &lt;td&gt;12.2 ms&lt;/td&gt;
 &lt;td&gt;11.2 ms&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Cython threaded&lt;/td&gt;
 &lt;td&gt;(6) 128 ms&lt;/td&gt;
 &lt;td&gt;5.68 ms&lt;/td&gt;
 &lt;td&gt;(8) 4.89 ms&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;pybind11 sequential&lt;/td&gt;
 &lt;td&gt;93.9 ms&lt;/td&gt;
 &lt;td&gt;9.20 ms&lt;/td&gt;
 &lt;td&gt;17.8 ms&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;pybind11 OpenMP atomic&lt;/td&gt;
 &lt;td&gt;4.06 ms&lt;/td&gt;
 &lt;td&gt;6.87 ms&lt;/td&gt;
 &lt;td&gt;1.91 ms&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;pybind11 C++11 atomic&lt;/td&gt;
 &lt;td&gt;(32) 10.7 ms&lt;/td&gt;
 &lt;td&gt;7.08 ms&lt;/td&gt;
 &lt;td&gt;(48) 2.65 ms&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;pybind11 C++11 merge&lt;/td&gt;
 &lt;td&gt;(32) 23.0 ms&lt;/td&gt;
 &lt;td&gt;6.03 ms&lt;/td&gt;
 &lt;td&gt;(48) 4.79 ms&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;pybind11 OpenMP merge&lt;/td&gt;
 &lt;td&gt;8.74 ms&lt;/td&gt;
 &lt;td&gt;5.04 ms&lt;/td&gt;
 &lt;td&gt;1.79 ms&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;</description></item><item><title>Binding Minuit2</title><link>https://iscinumpy.dev/post/binding-minuit2/</link><pubDate>Sat, 07 Jul 2018 21:00:00 +0200</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author><guid>https://iscinumpy.dev/post/binding-minuit2/</guid><description>&lt;p&gt;Let&amp;rsquo;s try a non-trivial example of a binding: Minuit2 (6.14.0 standalone
edition).&lt;/p&gt;</description></item><item><title>Tools to Bind to Python</title><link>https://iscinumpy.dev/post/tools-to-bind-to-python/</link><pubDate>Sat, 07 Jul 2018 21:00:00 +0200</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author><guid>https://iscinumpy.dev/post/tools-to-bind-to-python/</guid><description>&lt;p&gt;This was originally given as a PyHEP 2018 talk. It is designed to be
interactive, and can be run in SWAN if you have a CERN account. If you want to
run it manually, just download the repository:
&lt;a href="https://github.com/henryiii/pybindings_cc"&gt;github.com/henryiii/pybindings_cc&lt;/a&gt;.
It is easy to run in Anaconda.&lt;/p&gt;</description></item><item><title>Python 3 upgrade</title><link>https://iscinumpy.dev/post/python-3-upgrade/</link><pubDate>Wed, 12 Oct 2016 08:30:00 +0200</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author><guid>https://iscinumpy.dev/post/python-3-upgrade/</guid><description>&lt;p&gt;About ten years ago, Guido Van Rossum, the Python author and Benevolent Dictator
for Life (BDFL), along with the Python community, decided to make several
concurrent backward incompatible changes to Python 2.5 and release a new
version, Python 3.0.&lt;/p&gt;</description></item><item><title>A simple introduction to asyncio</title><link>https://iscinumpy.dev/post/a-simple-introduction-to-asyncio/</link><pubDate>Thu, 19 Nov 2015 09:46:00 -0800</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author><guid>https://iscinumpy.dev/post/a-simple-introduction-to-asyncio/</guid><description>&lt;p&gt;This is a simple explanation of the &lt;code&gt;asyncio&lt;/code&gt; module and new supporting language
features in Python 3.5. Even though the new keywords &lt;code&gt;async&lt;/code&gt; and &lt;code&gt;await&lt;/code&gt; are new
language constructs, they are mostly&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt; useless without an event loop, and that
is supplied in the standard library as &lt;code&gt;asyncio&lt;/code&gt;. Also, you need awaitable
functions, which are only supplied by &lt;code&gt;asyncio&lt;/code&gt; (or in the growing set of async
libraries, like &lt;code&gt;asyncssh&lt;/code&gt;, &lt;code&gt;quamash&lt;/code&gt; etc.).&lt;/p&gt;</description></item><item><title>A little example of how asyncio works</title><link>https://iscinumpy.dev/post/a-little-example-of-how-asyncio-works/</link><pubDate>Thu, 19 Nov 2015 09:43:00 -0800</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author><guid>https://iscinumpy.dev/post/a-little-example-of-how-asyncio-works/</guid><description>&lt;p&gt;This is a simple example to show how Asyncio works without using Asyncio itself,
instead using a basic and poorly written event loop. This is only meant to give
a flavor of what Asyncio does behind the curtains. I&amp;rsquo;m avoiding most details of
the library design, like callbacks, just to keep this simple. Since this is
written as an illustration, rather than real code, I&amp;rsquo;m going to dispense with
trying to keep it 2.7 compatible.&lt;/p&gt;</description></item><item><title>Slots in Python</title><link>https://iscinumpy.dev/post/slots-in-python/</link><pubDate>Thu, 06 Aug 2015 16:01:00 -0700</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author><guid>https://iscinumpy.dev/post/slots-in-python/</guid><description>&lt;p&gt;Slots seem to be poorly documented. What they do is simple, but whether they are
used is tricky. This is a little mini-post on slots.&lt;/p&gt;</description></item><item><title>Basics of metaclasses</title><link>https://iscinumpy.dev/post/basics-of-metaclasses/</link><pubDate>Thu, 06 Aug 2015 15:59:00 -0700</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author><guid>https://iscinumpy.dev/post/basics-of-metaclasses/</guid><description>&lt;p&gt;This is a quick tutorial over the basics of what metaclasses do.&lt;/p&gt;
&lt;h2 id="the-metaclass"&gt;The Metaclass&lt;/h2&gt;
&lt;p&gt;Metaclasses, while seemingly a complex topic, really just do something very
simple. They control what happens when you have code that turns into a class
object. The normal place they are executed is right after the class statement.
Let&amp;rsquo;s see that in action by using print as our metaclass.&lt;/p&gt;</description></item><item><title>Factory classmethods in Python</title><link>https://iscinumpy.dev/post/factory-classmethods-in-python/</link><pubDate>Wed, 29 Jul 2015 09:13:00 -0700</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author><guid>https://iscinumpy.dev/post/factory-classmethods-in-python/</guid><description>&lt;p&gt;I haven&amp;rsquo;t seen a great deal of practical documentation about using classmethods
as factories in Python (which is arguably the most important use of a
classmethod, IMO). This post hopes to fill in that gap.&lt;/p&gt;</description></item><item><title>Making an autoload extension for IPython</title><link>https://iscinumpy.dev/post/making-an-autoload-extension-for-ipython/</link><pubDate>Fri, 24 Jul 2015 07:06:00 -0700</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author><guid>https://iscinumpy.dev/post/making-an-autoload-extension-for-ipython/</guid><description>&lt;p&gt;I recently decided to try my hand at making an auto-load extension for Python
and Plumbum. I was planning to suggest it as a new feature, then I thought it
might be an experimental feature, and now it&amp;rsquo;s just a blog post. But it was an
interesting idea and didn&amp;rsquo;t seem to be well documented process on the web. So,
here it is.&lt;/p&gt;
&lt;p&gt;The plan was to make commands like this:&lt;/p&gt;</description></item><item><title>Uncertainty extension for IPython</title><link>https://iscinumpy.dev/post/uncertainty-extension-for-ipython/</link><pubDate>Fri, 24 Jul 2015 06:45:00 -0700</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author><guid>https://iscinumpy.dev/post/uncertainty-extension-for-ipython/</guid><description>&lt;p&gt;Wouldn&amp;rsquo;t it be nice if we had uncertainty with a nice notation in IPython? The
current method would be to use raw Python,&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;uncertainties&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ufloat&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ufloat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;12.34&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.01&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class="output"&gt;
12.340+/-0.010
&lt;/pre&gt;
&lt;p&gt;Let&amp;rsquo;s use the infix library to make the notation easier. We&amp;rsquo;ll define &lt;code&gt;|pm|&lt;/code&gt; to
mean &lt;code&gt;+/-&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Plumbum color</title><link>https://iscinumpy.dev/post/plumbum-color-post/</link><pubDate>Wed, 22 Jul 2015 12:25:00 -0700</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author><guid>https://iscinumpy.dev/post/plumbum-color-post/</guid><description>&lt;p&gt;I&amp;rsquo;ve been working on a color addition to Plumbum for a little while, and I&amp;rsquo;d
like to share the basics of using it with you now. This library was originally
built around a special &lt;code&gt;str&lt;/code&gt; subclass, but now is built on the new &lt;code&gt;Styles&lt;/code&gt;
representation and is far more powerful than the first implementation. It safely
does nothing if you do not have a color-compatible system (posix + tty
currently), but can be forced if need be. It is included with Plumbum, so you
don&amp;rsquo;t have to add a requirement for your scripts that is non-essential (as color
often is). It is integrated with &lt;code&gt;plumbum.cli&lt;/code&gt;, too. Also, I&amp;rsquo;ve managed to
accelerate the color selection algorithms about 8x, allowing near game-like
speeds. (see the &lt;code&gt;fullcolor.py&lt;/code&gt; example).&lt;/p&gt;</description></item><item><title>Plumbum scripting</title><link>https://iscinumpy.dev/post/plumbum-scripting/</link><pubDate>Sun, 12 Jul 2015 14:07:00 -0700</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author><guid>https://iscinumpy.dev/post/plumbum-scripting/</guid><description>&lt;p&gt;Scripting in Bash is a pain. Bash can do almost anything, and is unbeatable for
small scripts, but it struggles when scaling up to doing anything close to a
real world scripting problem. Python is a natural choice, especially for the
scientist who already is using it for analysis. But, it&amp;rsquo;s much harder to do
basic tasks in Python. So you are left with scripts starting out as Bash
scripts, and then becoming a mess, then being (usually poorly) ported to Python,
or even worse, being run by a Python script. I&amp;rsquo;ve seen countless Python scripts
that run Bash scripts that run real programs. I&amp;rsquo;ve even written one or two. It&amp;rsquo;s
not pretty.&lt;/p&gt;
&lt;p&gt;I recently came (back) across a really powerful library for doing efficient
command line scripts in Python. It contains a set of tools that makes the four
(five with color) main tasks of command line scripts simple and powerful. I will
also go over the one main drawback of the library (and the possible
enhancement!).&lt;/p&gt;</description></item></channel></rss>