CARVIEW |
Select Language
HTTP/2 200
server: GitHub.com
content-type: application/x-ipynb+json
last-modified: Thu, 13 Sep 2018 18:23:15 GMT
access-control-allow-origin: *
etag: W/"5b9aab13-3d583"
expires: Wed, 15 Oct 2025 01:12:37 GMT
cache-control: max-age=600
content-encoding: gzip
x-proxy-cache: MISS
x-github-request-id: 1049:4FF69:F555F:126506:68EEF2AC
accept-ranges: bytes
age: 0
date: Wed, 15 Oct 2025 01:02:37 GMT
via: 1.1 varnish
x-served-by: cache-bom-vanm7210052-BOM
x-cache: MISS
x-cache-hits: 0
x-timer: S1760490157.486546,VS0,VE310
vary: Accept-Encoding
x-fastly-request-id: 820d4cd149473f39f61b2cba157be45f3031f4fc
content-length: 174604
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Exploring Line Lengths in Python Packages"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"*This notebook originally appeared as a [post](https://jakevdp.github.io/blog/2017/11/09/exploring-line-lengths-in-python-packages/) on the blog [Pythonic Perambulations](https://jakevdp.github.io). The code content is MIT licensed.*"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"\n",
"This week, Twitter upped their single-tweet character limit from 140 to 280, purportedly based on this [interesting analysis of tweet lengths](https://blog.twitter.com/engineering/en_us/topics/insights/2017/Our-Discovery-of-Cramming.html) published on Twitter's engineering blog.\n",
"The gist of the analysis is this: English language tweets display a roughly log-normal distribution of character counts, except near the 140-character limit, at which the distribution spikes:\n",
"\n",
"
\n",
"\n",
"The analysis takes this as evidence that twitter users often \"cram\" their longer thoughts into the 140 character limit, and suggest that a 280-character limit would more naturally accommodate the distribution of people's desired tweet lengths.\n",
"\n",
"This immediately brought to mind another character limit that many Python programmers face in their day-to-day lives: the 79-character line limit suggested by Python's [PEP8 style guide](https://www.python.org/dev/peps/pep-0008/#maximum-line-length):\n",
"\n",
"> Limit all lines to a maximum of 79 characters.\n",
"\n",
"I began to wonder whether popular Python packages (e.g. NumPy, SciPy, Pandas, Scikit-Learn, Matplotlib, AstroPy) display anything similar to what is seen in the distribution of tweet lengths.\n",
"\n",
"Spoiler alert: they do! And the details of the distribution reveal some insights into the programming habits and stylistic conventions of the communities who write them.\n",
"\n",
""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Counting Lines in NumPy\n",
"\n",
"To take a look at this, we first need a way to access all the raw lines of code in any Python package.\n",
"In a standard system architecture, if you have installed a package you already have the Python source stored in your system.\n",
"For example, the ``numpy`` source code on my system is stored here:"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['/Users/jakevdp/anaconda/lib/python3.6/site-packages/numpy']"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import numpy\n",
"numpy.__path__"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"With this in mind, we can use the ``os.walk`` function to write a quick generator function that will iterate over all lines of Python code in a given package:"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# Python 3.X\n",
"import os\n",
"\n",
"def iter_lines(module):\n",
" \"\"\"Iterate over all lines of Python in module\"\"\"\n",
" for root, dirs, files in os.walk(module.__path__[0]):\n",
" for filename in files:\n",
" if filename.endswith('.py'):\n",
" with open(os.path.join(root, filename)) as f:\n",
" yield from f"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This returns a generator expression that iterates over all lines in order; let's see how many lines of Python code NumPy contains:"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"179615"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"lines = iter_lines(numpy)\n",
"len(list(lines))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Given this we can find the lengths of all the lines and plot a histogram:"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"%matplotlib inline\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"\n",
"plt.style.use('seaborn-whitegrid')"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"lengths = [len(line) for line in iter_lines(numpy)]\n",
"plt.hist(lengths, bins=np.arange(max(lengths)), histtype='step', linewidth=1);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The distribution is dominated by lines of length 1 (i.e. containing only a newline character): let's go ahead and remove these, and also narrow the x limits:"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\nAPiiawt99QAAAABJRU5ErkJggg==\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"lengths = [len(line) for line in iter_lines(numpy) if len(line) > 1]\n",
"plt.hist(lengths, bins=np.arange(125), histtype='step', linewidth=1);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now this is looking interesting!"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Cleaning the Distribution"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The first feature that pops out to me are the large spikes between 0 and 20 characters. To explore these, let's look at the lines that make up the largest spike:"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"13"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.argmax(np.bincount(lengths))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can use a list comprehension to extract all lines of length 13:"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"3637"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"lines13 = [line for line in iter_lines(numpy) if len(line) == 13]\n",
"len(lines13)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"There are 3637 lines in NumPy with a length of 13 characters. It's interesting to explore how many of these short lines are identical.\n",
"The Pandas ``value_counts`` function is useful for this:"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
" --------\\n 1349\n",
" Examples\\n 646\n",
" See Also\\n 645\n",
" try:\\n 218\n",
" pass\\n 62\n",
" See also\\n 59\n",
" return c\\n 38\n",
" return a\\n 22\n",
" None\\n 20\n",
" finally:\\n 19\n",
"dtype: int64"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import pandas as pd\n",
"pd.value_counts(lines13).head(10)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"It's clear tha many of these duplicates are just boiler-plate code or documentation standards that happen to appear often through the package; we may be able to clean up our histogram by plotting only the histogram of lengths of *unique* lines, by passing the ist through Python's ``set`` collection:"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"lengths = [len(line) for line in set(iter_lines(numpy))]\n",
"plt.hist(lengths, bins=np.arange(125), histtype='step', linewidth=1);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"That's a much cleaner distribution!"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Comparison Between Packages\n",
"\n",
"In order to aid comparison between packages, let's quickly refactor the above histogram code into a function that we can re-use. In addition, we'll add a vertical line at the PEP8's maximum character count:"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def hist_linelengths(module, ax):\n",
" \"\"\"Plot a histogram of lengths of unique lines in the given module\"\"\"\n",
" lengths = [len(line.rstrip('\\n')) for line in set(iter_lines(module))]\n",
" h = ax.hist(lengths, bins=np.arange(125) + 0.5, histtype='step', linewidth=1.5)\n",
" ax.axvline(x=79.5, linestyle=':', color='black')\n",
" ax.set(title=\"{0} {1}\".format(module.__name__, module.__version__),\n",
" xlim=(1, 100),\n",
" ylim=(0, None),\n",
" xlabel='characters in line',\n",
" ylabel='number of lines')\n",
" return h"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we can use that function to compare the distributions for a number of well-known scientific Python packages:"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA0oAAAF8CAYAAADxZkt0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJzs3XlAlHX+B/D3ABIiILFsKSmKRyuo\nrCkrHWiHEqaSVwqepbQeKUauyiGHJ2oalbe15baU6xFpaLr+FGVJMyx31QSsTLzBMlKuAGWe3x/4\njHPBcMzM8zzM+/VPw/DMM58h+fD9fE+VIAgCiIiIiIiISMNO6gCIiIiIiIjkhoUSERERERGRHhZK\nREREREREelgoERERERER6WGhREREREREpIeFEhERERERkR4WSiRLR48exbBhwxp13ccff4whQ4Zg\n6NChmDFjBn799Vejr63vdURkHd999x1mz55t1nsWFBSgX79+KCoqMvr96upqLFu2DIMGDUJwcDD+\n9a9/Nek6IpKXDz74ADExMWa51++//46//e1veOGFFxASEoJDhw4Zva6oqAizZs1CaGgoBg8ejJUr\nV0KtVgMALl68iPHjx2Pw4MF46aWX8NNPPxm9x9dff42RI0fixRdfxJgxY3DmzBmzfAZqGBZKJCsV\nFRV4++238cYbb6C6urrB1509exYffvghtm3bhr1796Jjx4549913DV5f3+uIyHp69uyJNWvWmO1+\nu3fvxvjx4/Hzzz/Xes22bdtw8eJF7N27F59++ik++ugjow2S+l5HRM3X2rVr4ezsjP3792PLli1Y\ntGgRCgsLDa5LTk5G586dsWfPHuzatQtnzpzBZ599BgCYO3cuwsPDsW/fPkRGRuL111+H/pGmVVVV\neOONN7B06VKkp6djxowZmDdvnlU+I+lioWRjsrOzER4ejnnz5mH48OEYOnQoTp48CQCIiYnBBx98\noLlW++vnnnsOKSkpGDNmDEJCQrBz507ExsbixRdfxMiRI3Hjxg3NdW+99RZGjhyJ4OBgbN26FQAQ\nHx+Pt99+W3Pvzz//HDNnzjSI7+jRo/j999+xYsWKOj9Hbdf16NEDBw4cgKurKyorK3Hjxg24u7sb\nvL6+1xFR45WVlWH27NkYNmwYRowYgfj4eE2v6qeffoohQ4YgNDQUkyZNQkFBAbKzszF06FAANfkn\n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\nsvD/AcDLnAg+cD2aAAAAAElFTkSuQmCC\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import numpy, scipy, matplotlib, pandas, sklearn, astropy\n",
"modules = [numpy, scipy, pandas, matplotlib, sklearn, astropy]\n",
"\n",
"fig, ax = plt.subplots(2, 3, figsize=(14, 6), sharex=True)\n",
"fig.subplots_adjust(hspace=0.2, wspace=0.2)\n",
"\n",
"for axi, module in zip(ax.flat, modules):\n",
" hist_linelengths(module, ax=axi)\n",
"\n",
"for axi in ax[0]:\n",
" axi.set_xlabel('')\n",
"for axi in ax[:, 1:].flat:\n",
" axi.set_ylabel('')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The results here are quite interesting: similar to Twitter's tweet length analysis, we see that each of these packages have a somewhat smooth distribution of characters, with a \"bump\" at or near the 79-character PEP8 limit!\n",
"Additionally, it is clear that some packages (namely matplotlib, sklearn, and particularly pandas) seem to be quite strict about this limit, while other packages (numpy, scipy, astropy) are a bit more lenient.\n",
"\n",
"But one package stands out: matplotlib displays some noticeable spikes at a few intermediate line lengths; let's take a look at these:"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"29"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"lines = set(iter_lines(matplotlib))\n",
"counts = np.bincount([len(line) for line in lines])\n",
"np.argmax(counts)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The large spike reflects the approximately 2200 lines with exactly 29 characters; printing all of these and examining them is interesting:"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[' pick(mouseevent)\\n',\n",
" \" if aspect == 'auto':\\n\",\n",
" ' for a in alias_list:\\n',\n",
" \" 'violet red': '#a50055',\\n\",\n",
" ' cache_dir = None\\n',\n",
" \" rc('image', cmap='gray')\\n\",\n",
" \" 'uni2270' : 8816,\\n\",\n",
" ' x0t -= delta\\n',\n",
" ' if lolims.any():\\n',\n",
" \" 'expanded' : 700,\\n\"]"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"[line for line in lines if len(line) == 29][:10]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We see that many lines seem to be defining some dictionary of keys starting with \"uni\":"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[\" 'uni2035' : 8245,\\n\",\n",
" \" 'uni203E' : 8254,\\n\",\n",
" \" 'uni2033' : 8243,\\n\",\n",
" \" 'uni2031' : 8241,\\n\",\n",
" \" 'uni2037' : 8247,\\n\",\n",
" \" 'uni203B' : 8251,\\n\",\n",
" \" 'uni2034' : 8244,\\n\",\n",
" \" 'uni2032' : 8242,\\n\",\n",
" \" 'uni203C' : 8252,\\n\",\n",
" \" 'uni2036' : 8246,\\n\",\n",
" \" 'uni2038' : 8248,\\n\"]"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"[line for line in lines if 'uni203' in line]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This turns out to be some auto-generated code [mapping unicode strings to numbers](https://github.com/matplotlib/matplotlib/blob/38be7aeaaac3691560aeadafe46722dda427ef47/lib/matplotlib/_mathtext_data.py).\n",
"Other spikes in the matplotlib are due to similar artifacts.\n",
"\n",
"There is also the mini-dropoff at line lengths of 70; I've not looked into it, but my suspicion is that might be a remnant of the code style used by matplotlib's creator in the early days of the package."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Modeling the Line Length Distribution\n",
"\n",
"Following the Twitter character analysis, let's see if we can fit a [log-normal distribution](https://en.wikipedia.org/wiki/Log-normal_distribution) to the number of lines with each character count.\n",
"As a reminder, the log-normal can be parametrized like this:\n",
"\n",
"$$\n",
"LogNorm(x; \\mu, \\sigma) = \\frac{1}{x \\sigma \\sqrt{2\\pi}} \\exp\\left(-\\frac{[\\log(x) - \\mu]^2}{2\\sigma^2}\\right)\n",
"$$\n",
"\n",
"Here $x$ is the number of counts, $\\exp(\\mu)$ is the median of the peak of the distribution, and $\\sigma^2$ controls the distribution's width.\n",
"We can implement this using the ``lognorm`` distribution available in scipy:"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from scipy import stats\n",
"\n",
"def lognorm_model(x, amplitude, mu, sigma):\n",
" return amplitude * stats.lognorm.pdf(x, scale=np.exp(mu), s=sigma)\n",
"\n",
"x = np.linspace(0, 100, 1000)\n",
"plt.plot(x, lognorm_model(x, 1000, 3.5, 0.7));"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"That seems like an appropriate shape for the left portion of our datasets; let's try optimizing the parameters to fit the counts of lines up to length 50:"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"optimal parameters: [ 9.92126791e+04 3.75476977e+00 5.19760726e-01]\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from scipy import optimize\n",
"\n",
"counts, bins, _ = hist_linelengths(numpy, ax=plt.axes())\n",
"lengths = 0.5 * (bins[:-1] + bins[1:])\n",
"\n",
"def minfunc(theta, lengths, counts):\n",
" return np.sum((counts - lognorm_model(lengths, *theta)) ** 2)\n",
"\n",
"opt = optimize.minimize(minfunc, x0=[10000, 4, 1],\n",
" args=(lengths[:50], counts[:50]),\n",
" method='Nelder-Mead')\n",
"print(\"optimal parameters:\", opt.x)\n",
"\n",
"plt.fill_between(lengths, lognorm_model(lengths, *opt.x), alpha=0.3, color='gray');"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Seems like a reasonable fit! From this, you could argue (as the Twitter engineering team did) that the line lengths might \"naturally\" follow a log-normal distribution, if it weren't for the artificial imposition of the PEP8 maximum line length.\n",
"\n",
"For convenience, let's create a function that will plot this lognormal fit for any given module:"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def lognorm_model(x, theta):\n",
" amp, mu, sigma = theta\n",
" return amp * stats.lognorm.pdf(x, scale=np.exp(mu), s=sigma)\n",
"\n",
"def minfunc(theta, lengths, freqs):\n",
" return np.sum((freqs - lognorm_model(lengths, theta)) ** 2)\n",
"\n",
"def lognorm_mode(amp, mu, sigma):\n",
" return np.exp(mu - sigma ** 2)\n",
"\n",
"def lognorm_std(amp, mu, sigma):\n",
" var = (np.exp(sigma ** 2) - 1) * np.exp(2 * mu + sigma ** 2)\n",
" return np.sqrt(var)"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def hist_linelengths_with_fit(module, ax, indices=slice(50)):\n",
" counts, bins, _ = hist_linelengths(module, ax)\n",
" lengths = 0.5 * (bins[:-1] + bins[1:])\n",
" opt = optimize.minimize(minfunc, x0=[1E5, 4, 0.5],\n",
" args=(lengths[indices], counts[indices]),\n",
" method='Nelder-Mead')\n",
" model_counts = lognorm_model(lengths, opt.x)\n",
" ax.fill_between(lengths, model_counts, alpha=0.3, color='gray')\n",
" \n",
" # Add text describing mu and sigma\n",
" \n",
" A, mu, sigma = opt.x\n",
" mode = np.exp(mu - sigma ** 2)\n",
" ax.text(0.22, 0.15, 'mode = {0:.1f}'.format(lognorm_mode(*opt.x)),\n",
" transform=ax.transAxes, size=14)\n",
" ax.text(0.22, 0.05, 'stdev = {0:.1f}'.format(lognorm_std(*opt.x)),\n",
" transform=ax.transAxes, size=14)\n",
" \n",
" return opt.x"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we can compare the models for each package:"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\nQm21c+dOafTo0ZIkSZJWq5XefvttKTo6Wvr777+lvn37SsePH5cee+wx6dKlS5IkSfL9kiRJH330\nkbR8+XJJr9dLkiRJK1askObNmyfp9XppxIgR0vXr1yVJkqTExESpbdu2Umpqqpx7YmNj5fLatm0r\nf+c3btwoPf/88yXiXL9+vTRnzhz5Z41GI7Vq1UrKzs4u9bUZc5lRaGioFBoaKqnVaiknJ0caOXKk\n/NpLU1auEQTBvLLqIqNGjZJ2794tSZIkXbp0SZo/f74kSebrKMY8cezYMemxxx6Tv4s7duyQnnzy\nSUmv10szZ86UBg4cKOXk5EiFhYXS888/L23dulUqLCyUHnzwQSkyMlKSJElavXq19P7775cZd2xs\nrNStWzfp4MGDJX43evRoOW5JkqSjR49KAwcOLLO8jIwMqW/fvtLWrVvLfsOEaidGlGqBgIAAQkJC\nAAgKCsLT0xNnZ2d8fX1xd3cnMzOTe++9F29vb7Zt20ZMTAwnTpzA3d3dbHlt2rThvvvuA+A///kP\nCxcuJD09Xf79+fPnCQoK4p577gGgZcuWdOzYkZMnT9KlS5cKxfzss8/i6OiIh4cHffr04dixYzz8\n8MNmrz1y5Ahvvvkms2fPpm3bthV+X4qTJMmkh1mSJLmnSBAEU506dWLVqlWMHDmSrl278sILL9Ck\nSRMSExNJTExk/PjxDBs2jDZt2pR47J9//kl2djbHjh0DQKPRULduXRQKBZ988gl//vknu3fv5tq1\na0iSRH5+PgB+fn40btxYLsff31/+zoeEhLBz584Sz6XX60uMHAGV+m7PmjWLd955h0GDBlGvXj26\ndevGf//73wo/XhCEiimrLvLkk0+ycOFCDh48SNeuXZk6darZMormiSNHjvDUU0/h6+sLGEZzlixZ\nQmxsLACDBg2Syx8wYAAHDhxgxIgRDB48mO+++46ZM2fKI1KluXjxIhMnTmTEiBElRpmh8nWLmzdv\n8tprr9GxY0eef/75st4uwQJELbAWKDpUDODoWLJ9/OeffzJu3DjAsF5o2LBhpZanVCrLvE+n05Wo\nmEiShFarrXDMRcuTJMlszACbNm1ixowZrFy5koEDB1a4fHP8/PxM1hUkJyfTqFGjOypTEGqqwMBA\nfv/9d8aOHUtOTg4vvfQSBw8eBAzf388//5ydO3dy7ty5Eo/V6/W89dZb/PTTT/z000989913fPDB\n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\nuoqaXe66RQWQnZ3t0NGkgoICACIiIoiIiGD48OF06tQJLy8v9Hq93BLRz8+PL774goCAAJ566ilU\nKhWjRo3i559/ls+1bds27rvvPu655x7Aupvy6dOn+de//sXEiRO566672Lt3r5yI9u7dW6vhQk22\nOwgVFRVNvpsQHh5O165dWbduHS+//DIajYZ3330XjUaDyWSqd/ytt95KcnIyqampjBo1ioKCAnm+\ncEN3jZVEr9ej1+uRJImysjKKi4tRq9Wc+nYLKrUK84uPuDtEwcFiQrx47Y8hTu+S2Vzyybvvvku/\nfv3o3r37FeeXm81mli1bRlVVFY899pjdY/r378/GjRvp27cv3bp147vvviMjI6PeSHZzc3b3NusX\nT4pCSels1yEA6bmltA1Q4+vr/C6pzSWf1LR37162bdvGiy++KM/oyM3NJTY2lscff5zKykqSkpJY\nv349zz777LX9wJqp1FTrHo/XUig1psGDbbN1T5iqdyWiULoKW5HUvWUgbQPVWCwWh0796tOnD927\nd5fnx95+++0MGjTIbmvDCxcu0K5du1pzkjt27Cjfcc3KyuLcuXO1mimYTCY6d+4MWOfd2hYfnjt3\njkuXLtGvXz+7cY0YMQKwDlvXfL+BAwfKd1OuxUsvvcTixYuJi4tDr9czcuRIfv31V7sXjkFBQUyd\nOpUVK1bw6aefEhwczLBhw0hJSWlW7dhVKhU+Pj74+PhgsVjo81QikiRx9uxZdDodYWFh+Pv7O21v\nAME1zGZTvSkoztIc8smhQ4c4cuQIq1atuuL3ajQaWbp0KYcPH2bu3LkNXjDdf//9ZGVlMXv2bCwW\nC7fccgv33nsvFRUVVzy/0vV9RuzL1lzUvA7p1MKHKG/XTEFvDvmkpt27d7NixQr+8pe/cN999wHW\nIiklJYWUlBR5ffWLL77I7NmzGT58+A2zDulK1qxZc03H22tU5OmjRlciCqVG6N4ykI1xvTh+/Dh+\nfn4OPbder2fevHmkp6fz008/sXfvXr744gsWLlxITEzMVV9fc+jdbDbz6KOP8qc//anWMbYFbT16\n9MDX15eDBw/yyy+/cNtttzV48bZixQrAOr8/KipKfvx6C5WoqCiWLVtGaWmpPJqyadMmIiIi7B7f\nu3dvNm7cSElJCUFBQRw6dMghbR49lVqtxtvfuibLx0eisrKSzMxMALy9vQkNDSUwMBBfX1/RRERB\n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\nPz+fyspK7rzzTo+PPTAwUP4lDQoKwmQyKeKzYmMv1j59+rBnzx4sFgs5OTlYLBZCQ0PdHKkyKTWX\ngHLziVJzCYh8IlyZUvOJUnMJKDefKD2XgOPyieh65wTz58/nq6++IjY2Vn5sxowZzJ8/H6PRSGxs\nLPPnz0ej0bgxyisbM2YMiYmJqNVqZs2apYi4Fy9ezI8//ogkSfz973+ndevWHh97RUUFCQkJFBYW\nYjQaiYuL46abbvLouLOysnjppZf46KOPOHv2rN1Y3377bXbv3o3FYmH69Oken1A9VXPIJaC8fKLE\nXAIinwhX1hzyidJyCSgznygxl4Bz8okolARBEARBEARBEOoQU+8EQRAEQRAEQRDqEIWSIAiCIAiC\nIAhCHaJQEgRBEARBEARBqEMUSoIgCIIgCIIgCHWIQkkQBEEQBEEQBKEOUSjd4LZu3cqSJUuc/j6b\nN2922LmSk5M5evRoo479wx/+AMDrr79OTk6Ow2IQBKE2kUsEQXAUkU8ETyEKJcEl1q5d67BzPffc\nc9x8883X9JoZM2YQHR3tsBgEQXAPkUsEQXAUkU+Eq9G6OwDBdaqqqpg+fTo5OTkYjUZmzZoFwJEj\nRxg3bhzFxcU88cQTjBw5kq+//pr33ntPfu1bb73FmTNnWLJkCV5eXowYMQJvb+96xwQHBzN//nyO\nHj2K0Wjkb3/7G2fOnOHy5cskJiYyY8YM5syZw/nz57FYLEyePJl+/foxePBg2rdvj06n48knn2TR\nokVotVoCAwNZsmQJ/v7+8vtMmzaNhx56iKKiInbt2kVVVRW//fYbzz77LMOGDbP7vds2qfvyyy/J\nysri4sWL5OTkMH36dPr378+BAwdYvnw5Go2GNm3aMHfuXLy8vJz0LyEIyiZyicglguAoIp+IfOLJ\nxIjSDeTDDz+kVatWbNmyhTfeeIMjR44AoNVqeffdd1m1ahWbNm0C4Ny5cyQnJ5OamkpMTAx79uwB\noLq6mvfff5+hQ4faPea7776jpKSEf/7zn6SkpHDs2DGef/55goKCSExM5OOPPyYkJIT33nuPNWvW\nMHfuXAB+//13XnjhBZYtW8a3337LoEGD2Lx5M8OHD6e0tLTB76m8vJykpCTWrl1LcnJyo34OOp2O\nlJQUZsyYwcaNG5EkiVmzZrFq1So2b95MZGQk27Zta8qPWhCaNZFLrEQuEYSmE/nESuQTzyRGlG4g\nmZmZDBgwAIDOnTvTuXNntm7dSvfu3VGpVISHh1NVVQVAWFgYU6dOxc/Pj8zMTHr16gVATEyMfD57\nx5w9e1Y+Njw8nL///e+1Yjh9+jRpaWnyPF6TyURJSUmtc48fP5533nmHsWPHEnh8rscAAAH/SURB\nVBkZecWh7K5duwLQsmVLDAZDo34O3bp1AyAqKgqDwUBxcTEFBQVMnjwZsN7dss0fFgShPpFLrEQu\nEYSmE/nESuQTzyRGlG4gHTp04NixYwBcuHCBKVOmAKBSqWodV1ZWxsqVK1m+fDnz589Hr9cjSRIA\narX6isfExsbK71FWVsYzzzwDIL8+NjaWhx9+mNTUVNatW8eDDz5IUFBQrXNv376dRx99lNTUVDp1\n6sRHH33U4PdUN/bGqPuakJAQoqKiWLNmDampqYwfP55+/fpd83kF4UYhcon914hcIgjXTuQT+68R\n+cQziBGlG8jjjz9OQkICo0ePxmw2k5CQwJkzZ+od5+/vT58+fXj00Ufx9fUlMDCQgoICWrdufdVj\nhg0bxr59+3jiiScwm81MmDABsCbCl19+mQULFjBz5kxGjx5NeXk5o0aNkpOQTc+ePZk2bRq+vr54\neXnJQ+DOolarmTFjBs899xySJOHn58fixYud+p6CoGQil9gncokgXDuRT+wT+cQzqCRbOS0IgiAI\ngiAIgiAAYuqdIAiCIAiCIAhCPaJQEgRBEARBEARBqEMUSoIgCIIgCIIgCHWIQkkQBEEQBEEQBKEO\nUSgJgiAIgiAIgiDUIQolQRAEQRAEQRCEOkShJAiCIAiCIAiCUIcolARBEARBEARBEOr4fwiCUgiN\nr6SFAAAAAElFTkSuQmCC\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"modules = [numpy, scipy, pandas, matplotlib, sklearn, astropy]\n",
"\n",
"fig, ax = plt.subplots(2, 3, figsize=(14, 6), sharex=True)\n",
"fig.subplots_adjust(hspace=0.2, wspace=0.2)\n",
"\n",
"fits = {}\n",
"\n",
"for axi, module in zip(ax.flat, modules):\n",
" fits[module.__name__] = hist_linelengths_with_fit(module, ax=axi)\n",
" \n",
"\n",
"for axi in ax[0]:\n",
" axi.set_xlabel('')\n",
"for axi in ax[:, 1:].flat:\n",
" axi.set_ylabel('')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"It is also interesting to use these summary statistics as a way of describing the \"essence\" of each package, in order to compare them directly:"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\nyBhuIGDiAAAAAElFTkSuQmCC\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"ha = {'sklearn': 'right', 'scipy': 'right', 'pandas': 'right'}\n",
"va = {'sklearn': 'top'}\n",
"for name, fit in sorted(fits.items()):\n",
" mode = lognorm_mode(*fit)\n",
" std = lognorm_std(*fit)\n",
" plt.plot(mode, std, 'ok')\n",
" plt.text(mode, std, ' ' + name + ' ', size=14,\n",
" ha=ha.get(name, 'left'), va=va.get(name, 'bottom'))\n",
"plt.xlabel('mode of model', size=14)\n",
"plt.ylabel('std. deviation of model', size=14);\n",
"plt.xlim(30, 41);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Discussion\n",
"\n",
"I found it curious that a log-normal distribution fits both tweets and lines of code. Doing some digging, I found some [literature on the subject](https://epjdatascience.springeropen.com/articles/10.1140/epjds14) of message lengths on the internet. This study finds that across languages and mediums, comment lengths follow a log-normal distribution quite closely. They propose a mechanism related to the [Weber-Fechner law](https://en.wikipedia.org/wiki/Weber%E2%80%93Fechner_law), which suggests a logarithmic scale in degrees of perception. It seems reasonable that lengths of code lines would respond to the same mechanism.\n",
"\n",
"As for the data, I think it's quite interesting what this reveals about each project's commitment to the PEP8 line length.\n",
"Pandas, Scikit-Learn, and Matplotlib seem to be strongly committed to keeping their lines below 79 characters; by contrast, AstroPy doesn't seem to mind the occasional long line (though it does still display a \"cramming\" pattern, to use the parlance of the Twitter team's analysis).\n",
"\n",
"Comparing the summary statistics between packages, it is interesting to note the relative similarity of the numpy and scipy packages in terms of distribution of line lengths. This makes a lot of sense, because historically the development team has overlapped strongly between these two packages.\n",
"\n",
"By contrast, scikit-learn tends to have around 10 more characters per line, and a much wider distribution of typical line lengths. I suspect the length of the lines is due to the nature of scikit-learn's code: it has relatively long class names (e.g. ``RandomForestClassifier``) which are used frequently throughout the code. The prevalence of classes also adds a four-space indentation to much of the package.\n",
"As for the larger standard deviation, this may be due to the larger pool of contributors: scikit-learn has about twice the total number of contributors as either numpy or scipy.\n",
"\n",
"Pandas is interesting in that it doesn't show the pronounced \"cramming\" effect seen in the other packages. Long lines seem to be broken-up in a more distributed way, perhaps through assignment of temporary variables rather than through line breaks.\n",
"\n",
"Each package displays a distinct \"fingerprint\" regarding the lengths of code lines, and the above visualizations suggest that PEP8's restrictions really do affect the way people write code, particularly in packages that use more characters per line, such as Pandas and Scikit-Learn."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Keep in mind that all of this is based on a couple fairly strong assumptions:\n",
"\n",
"1. PEP8 aside, the \"natural\" distribution of line lengths is log-normal\n",
"2. We can meaningfully extrapolate from the frequency of lines with fewer than 50 characters to find statistics describing this \"natural\" log-normal distribution.\n",
"\n",
"We *could* follow the lead of the Twitter engineering team, and use this analysis to argue that the PEP8 line length limit should be lifted, so as to not constrain people's \"natural\" inclinations toward the top end of each distribution. But I think that good arguments can be made, in both the case of PEP8 and Twitter's character limit, that this is too eager an interpretation.\n",
"\n",
"Those controversies aside, it would be interesting to dive a bit deeper into this kind of analysis. I can think of a few interesting question you could ask:\n",
"\n",
"- Where do other Python packages fit on the mode/spread graph?\n",
"- Has the coding style in these packages, reflected in line length, evolved over time?\n",
"- How do individual contributors behave? Do they tend to have similar habits across packages?\n",
"- What do these distributions look like for code written in other languages?\n",
"\n",
"All of these would be interesting to address, but I've spent enough words on this already: I'll leave those questions for another time, or another person. Thanks for reading!"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"*This post was written entirely in the Jupyter notebook. You can\n",
"[download](https://jakevdp.github.io/downloads/notebooks/PEP8LineLengths.ipynb)\n",
"this notebook, or see a static view\n",
"[on nbviewer](https://nbviewer.jupyter.org/url/jakevdp.github.io/downloads/notebooks/PEP8LineLengths.ipynb).*"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Conda Root",
"language": "python",
"name": "conda-root"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.1"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
