<?xml version="1.0" encoding="utf-8" standalone="yes"?><?xml-stylesheet type="text/xsl" href="/rss.xsl"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Python Developer Tooling Handbook – Scientific-Python</title>
    <link>https://pydevtools.com/tags/scientific-python/</link>
    <description>The Python Developer Tooling Handbook is a comprehensive guide to Python development tools including uv, ruff, pytest, mypy, ty, and more.</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <lastBuildDate>Wed, 15 Apr 2026 00:00:00 +0000</lastBuildDate>
    
	  <atom:link href="https://pydevtools.com/tags/scientific-python/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
      <title>Your Python Wheels Still Target 2009 CPUs</title>
      <link>https://pydevtools.com/blog/your-python-wheels-still-target-2009-cpus/</link>
      <pubDate>Wed, 15 Apr 2026 00:00:00 +0000</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/your-python-wheels-still-target-2009-cpus/</guid>
      <description>&lt;p&gt;Intel shipped AVX2 in 2013. AMD reached it with Excavator-era parts around 2015. Eleven years later, the default NumPy wheel &lt;a href=&#34;https://pydevtools.com/handbook/reference/pip/&#34;&gt;pip&lt;/a&gt; downloads on an &lt;code&gt;x86_64&lt;/code&gt; Linux box is still compiled to run on processors from roughly 2003, the year AMD launched the Opteron and defined the AMD64 baseline. Every SIMD instruction that has shipped since is off-limits to the compiler that produced that wheel.&lt;/p&gt;
&lt;p&gt;The reason is structural. A &lt;a href=&#34;https://pydevtools.com/handbook/reference/wheel/&#34;&gt;wheel&lt;/a&gt; filename encodes three pieces of compatibility metadata: Python version, ABI, and platform. &amp;ldquo;Platform&amp;rdquo; for mainstream Linux wheels is typically &lt;code&gt;manylinux_2_17_x86_64&lt;/code&gt;, which says &amp;ldquo;works on any glibc 2.17+ x86-64 distro&amp;rdquo; and nothing about which CPU instruction sets the machine supports. When a project publishes one binary for all of those users, it has to target the lowest common denominator.&lt;/p&gt;</description>
    </item>
    <item>
      <title>In 2012, Guido Had No Idea NumPy Had Its Own Packaging System</title>
      <link>https://pydevtools.com/blog/guido-had-no-idea-about-numpy-distutils/</link>
      <pubDate>Tue, 07 Apr 2026 00:00:00 +0000</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/guido-had-no-idea-about-numpy-distutils/</guid>
      <description>&lt;p&gt;In a &lt;a href=&#34;https://youtu.be/QjXJLVINsSA&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;recently resurfaced 2012 PyData panel discussion&lt;/a&gt;, Fernando Perez, Travis Oliphant, and David Cournapeau sat down with Guido van Rossum to discuss the scientific Python community&amp;rsquo;s needs. The conversation wandered through operator overloading (which eventually produced the &lt;code&gt;@&lt;/code&gt; matrix multiplication operator in Python 3.5) and import performance on supercomputers. The packaging segment is the one worth revisiting.&lt;/p&gt;
&lt;p&gt;David Cournapeau, who maintained NumPy&amp;rsquo;s build infrastructure, explained that NumPy had written its own packaging layer on top of &lt;a href=&#34;https://pydevtools.com/handbook/reference/distutils/&#34;&gt;distutils&lt;/a&gt; that was &amp;ldquo;as much code as distutils itself.&amp;rdquo; NumPy had to override nearly every piece of distutils to handle Fortran compilers, C++ extensions, &lt;a href=&#34;https://cython.org/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Cython&lt;/a&gt;, cross-platform compiler flags, and builds on exotic hardware like IBM Blue Gene supercomputers.&lt;/p&gt;</description>
    </item>
    <item>
      <title>One Line Command to Launch a Notebook with Pytorch</title>
      <link>https://pydevtools.com/blog/one-line-command-to-launch-a-notebook-with-pytorch/</link>
      <pubDate>Wed, 15 Jan 2025 14:18:00 +0000</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/one-line-command-to-launch-a-notebook-with-pytorch/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://docs.astral.sh/uv/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;uv&lt;/a&gt; is changing how accessible Python is for new users.&lt;/p&gt;
&lt;p&gt;If you want to try out &lt;a href=&#34;https://pytorch.org&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;pytorch&lt;/a&gt; in a Jupyter Notebook, you can &lt;a href=&#34;https://docs.astral.sh/uv/getting-started/installation/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;install uv&lt;/a&gt; and then run this single line command:&lt;/p&gt;
&lt;div class=&#34;hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code&#34;&gt;

&lt;div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;uv run --python 3.12 --with &lt;span class=&#34;s2&#34;&gt;&amp;#34;torch~=2.4&amp;#34;&lt;/span&gt; --with jupyter --with &lt;span class=&#34;s2&#34;&gt;&amp;#34;numpy&amp;lt;2&amp;#34;&lt;/span&gt; jupyter lab&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;hextra-code-copy-btn-container  hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0&#34;&gt;
  &lt;button
    class=&#34;hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50&#34;
    title=&#34;Copy code&#34;
    aria-label=&#34;Copy code&#34;
    data-copied-label=&#34;Copied!&#34;
  &gt;
    &lt;div class=&#34;hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4&#34;&gt;&lt;/div&gt;
&lt;div class=&#34;hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4&#34;&gt;&lt;/div&gt;
  &lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;uv will grab all your dependencies (including Python 3.12, if you don&amp;rsquo;t have it installed), install them in an isolated environment, and launch Jupyter Lab.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Scientific Python Library Development Guide</title>
      <link>https://pydevtools.com/blog/scientific-python-library-development-guide/</link>
      <pubDate>Mon, 12 Feb 2024 00:00:00 +0000</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/scientific-python-library-development-guide/</guid>
      <description>&lt;p&gt;Along with the &lt;a href=&#34;https://packaging.python.org/en/latest/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Python Packaging User Guide&lt;/a&gt;,
another excellent resource for learning about Python development practice is the
&lt;a href=&#34;https://learn.scientific-python.org/development/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Scientific Python Library Development
Guide&lt;/a&gt;, a &amp;ldquo;guide is maintained by the
scientific Python community for the benefit of fellow scientists and research software
engineers&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;I especially like their &lt;a href=&#34;https://learn.scientific-python.org/development/guides/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;topical
guides&lt;/a&gt; on topics like
&lt;a href=&#34;https://learn.scientific-python.org/development/guides/packaging-simple/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;packaging&lt;/a&gt;
and &lt;a href=&#34;https://learn.scientific-python.org/development/guides/gha-basic/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;getting started with Github Actions&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    
  </channel>
</rss>
