<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Vivek Kalyanarangan</title>
    <description>The latest articles on Forem by Vivek Kalyanarangan (@vivek_kalyanarangan_f66cc).</description>
    <link>https://forem.com/vivek_kalyanarangan_f66cc</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3732213%2F6904d092-3570-4ce9-94ac-e25971d3852c.jpg</url>
      <title>Forem: Vivek Kalyanarangan</title>
      <link>https://forem.com/vivek_kalyanarangan_f66cc</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/vivek_kalyanarangan_f66cc"/>
    <language>en</language>
    <item>
      <title>I got 29x speedup rewriting Python's validators library in Rust</title>
      <dc:creator>Vivek Kalyanarangan</dc:creator>
      <pubDate>Mon, 26 Jan 2026 04:39:27 +0000</pubDate>
      <link>https://forem.com/vivek_kalyanarangan_f66cc/i-got-29x-speedup-rewriting-pythons-validators-library-in-rust-2nhk</link>
      <guid>https://forem.com/vivek_kalyanarangan_f66cc/i-got-29x-speedup-rewriting-pythons-validators-library-in-rust-2nhk</guid>
      <description>&lt;p&gt;I've been using Python's &lt;code&gt;validators&lt;/code&gt; library for a while — it's great for quick checks without defining schemas. But it became a bottleneck when validating millions of URLs and emails in data pipelines.&lt;/p&gt;

&lt;p&gt;So I rewrote it in Rust.&lt;/p&gt;

&lt;h2&gt;
  
  
  The results
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Validator&lt;/th&gt;
&lt;th&gt;Speedup&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ipv4&lt;/td&gt;
&lt;td&gt;47.0x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ipv6&lt;/td&gt;
&lt;td&gt;39.4x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;url&lt;/td&gt;
&lt;td&gt;35.9x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;email&lt;/td&gt;
&lt;td&gt;28.5x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;domain&lt;/td&gt;
&lt;td&gt;28.3x&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Average: &lt;strong&gt;29x faster&lt;/strong&gt; across 48 validators.&lt;/p&gt;

&lt;h2&gt;
  
  
  Drop-in replacement
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Change one line
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;rapidvalidators&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;validators&lt;/span&gt;

&lt;span class="n"&gt;validators&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;email&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;test@example.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# True
&lt;/span&gt;&lt;span class="n"&gt;validators&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://github.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# True
&lt;/span&gt;&lt;span class="n"&gt;validators&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;btc_address&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# True
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. Same API, same behavior, just faster.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I learned building this
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;PyO3 + maturin is mature.&lt;/strong&gt; Publishing wheels for Python 3.8-3.13 across Linux/macOS/Windows was straightforward. GitHub Actions + maturin handled cross-compilation without drama.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hand-rolled parsing beats regex for simple patterns.&lt;/strong&gt; For IPv4 validation, a simple split-and-parse approach was significantly faster than regex. Rust's regex crate is fast, but nothing beats avoiding it entirely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Edge cases are brutal.&lt;/strong&gt; URL validation alone has dozens of edge cases — international domain names, punycode, IPv6 hosts, weird port numbers. I wrote 370 tests to ensure parity with the original library.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The hardest validators were international ones.&lt;/strong&gt; Spanish NIE, Indian Aadhaar, Finnish SSN — each has its own checksum algorithm. Lots of Wikipedia rabbit holes.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's included
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Network:&lt;/strong&gt; email, url, domain, ipv4, ipv6, mac_address, hostname&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Finance:&lt;/strong&gt; iban, card_number, visa, mastercard, amex, cusip, isin&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Crypto:&lt;/strong&gt; btc_address, eth_address, bsc_address, trx_address
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hashes:&lt;/strong&gt; md5, sha1, sha256, sha512&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Encoding:&lt;/strong&gt; base16, base32, base58, base64&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;International:&lt;/strong&gt; Spanish (CIF, NIE, NIF), Indian (Aadhaar, PAN), Finnish, French, Russian&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;48 validators total.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PyPI:&lt;/strong&gt; &lt;a href="https://pypi.org/project/rapidvalidators/" rel="noopener noreferrer"&gt;https://pypi.org/project/rapidvalidators/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/vivekkalyanarangan30/rapidvalidators" rel="noopener noreferrer"&gt;https://github.com/vivekkalyanarangan30/rapidvalidators&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're processing lots of data and validators is in your dependency tree, give it a try. Happy to hear feedback or add validators people need.&lt;/p&gt;

</description>
      <category>rust</category>
      <category>python</category>
      <category>performance</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
