Files that are both large and changed often are where bugs tend to cluster and where refactoring pays off first. Each file in the current tree is placed by its size and by the number of commits that changed it; its hotspot score is changes × √lines. Files without counted lines, such as binary files, are left out.
Each dot is a file; a bigger dot is a higher score. The dashed lines mark the median file size and the median number of changes, so the large files that change often are in the top right. Both axes are logarithmic. Showing the 2,000 highest-scoring of 2,298 files.
The files ranked by hotspot score: the larger a file is and the more often it changes, the higher it ranks. Authors is how many people have changed the file, bots aside, as on the Code Ownership page: a hotspot only one person has changed is also a bus-factor risk.
| File | Lines | Changes | Authors | Score | |
|---|---|---|---|---|---|
| numpy/__init__.pyi | 13,414 | 749 | 55 | 86,748.3 | |
| numpy/ma/core.py | 9,121 | 690 | 134 | 65,897.7 | |
| numpy/ma/tests/test_core.py | 6,276 | 440 | 87 | 34,857.3 | |
| numpy/lib/tests/test_function_base.py | 5,136 | 459 | 134 | 32,894.6 | |
| numpy/_core/tests/test_multiarray.py | 12,263 | 209 | 52 | 23,144.3 | |
| numpy/lib/tests/test_io.py | 2,733 | 300 | 86 | 15,683.4 | |
| numpy/random/_generator.pyx | 5,086 | 190 | 65 | 13,550.1 | |
| numpy/f2py/crackfortran.py | 3,727 | 214 | 51 | 13,064.5 | |
| doc/source/reference/c-api/array.rst | 4,937 | 183 | 52 | 12,858.3 | |
| numpy/ma/core.pyi | 4,997 | 174 | 20 | 12,300.0 |
| File | Lines | Changes | Authors | Score | |
|---|---|---|---|---|---|
| numpy/__init__.pyi | 13,414 | 749 | 55 | 86,748.3 | |
| numpy/ma/core.py | 9,121 | 690 | 134 | 65,897.7 | |
| numpy/ma/tests/test_core.py | 6,276 | 440 | 87 | 34,857.3 | |
| numpy/lib/tests/test_function_base.py | 5,136 | 459 | 134 | 32,894.6 | |
| numpy/_core/tests/test_multiarray.py | 12,263 | 209 | 52 | 23,144.3 | |
| numpy/lib/tests/test_io.py | 2,733 | 300 | 86 | 15,683.4 | |
| numpy/random/_generator.pyx | 5,086 | 190 | 65 | 13,550.1 | |
| numpy/f2py/crackfortran.py | 3,727 | 214 | 51 | 13,064.5 | |
| doc/source/reference/c-api/array.rst | 4,937 | 183 | 52 | 12,858.3 | |
| numpy/ma/core.pyi | 4,997 | 174 | 20 | 12,300.0 | |
| numpy/lib/_function_base_impl.py | 5,847 | 152 | 57 | 11,622.8 | |
| numpy/testing/_private/utils.py | 2,916 | 215 | 71 | 11,610.0 | |
| numpy/_core/umath.pyi | 24,355 | 73 | 2 | 11,392.4 | |
| numpy/random/mtrand.pyx | 4,986 | 158 | 52 | 11,156.6 | |
| numpy/linalg/tests/test_linalg.py | 2,552 | 211 | 66 | 10,659.2 | |
| numpy/ma/extras.py | 2,457 | 214 | 79 | 10,607.6 | |
| numpy/_core/src/multiarray/multiarraymodule.c | 5,716 | 134 | 27 | 10,131.0 | |
| numpy/_core/_add_newdocs.py | 7,145 | 108 | 38 | 9,129.0 | |
| numpy/_core/src/umath/ufunc_object.c | 7,389 | 105 | 20 | 9,025.7 | |
| numpy/_core/fromnumeric.pyi | 6,310 | 103 | 12 | 8,181.9 | |
| numpy/__init__.py | 928 | 263 | 54 | 8,011.8 | |
| numpy/testing/tests/test_utils.py | 2,171 | 169 | 56 | 7,874.4 | |
| numpy/_core/multiarray.pyi | 4,506 | 111 | 10 | 7,451.1 | |
| numpy/_core/tests/test_umath.py | 5,502 | 99 | 33 | 7,343.4 | |
| numpy/_core/tests/test_numeric.py | 4,331 | 103 | 37 | 6,778.5 | |
| numpy/_core/tests/test_stringdtype.py | 3,717 | 110 | 15 | 6,706.4 | |
| numpy/_core/fromnumeric.py | 4,492 | 90 | 42 | 6,032.0 | |
| numpy/ma/tests/test_extras.py | 2,157 | 128 | 52 | 5,944.8 | |
| numpy/polynomial/chebyshev.py | 2,053 | 131 | 47 | 5,935.6 | |
| numpy/random/tests/test_random.py | 1,723 | 137 | 46 | 5,686.7 | |
| numpy/_core/src/multiarray/ctors.c | 4,163 | 88 | 23 | 5,677.9 | |
| numpy/random/tests/test_generator_mt19937.py | 2,829 | 101 | 28 | 5,372.0 | |
| numpy/polynomial/polynomial.py | 1,683 | 129 | 47 | 5,292.1 | |
| numpy/_core/meson.build | 1,571 | 127 | 37 | 5,033.8 | |
| numpy/_core/tests/test_ufunc.py | 3,585 | 84 | 25 | 5,029.5 | |
| numpy/typing/tests/data/reveal/ufuncs.pyi | 5,398 | 68 | 7 | 4,996.0 | |
| numpy/f2py/cfuncs.py | 1,597 | 123 | 32 | 4,915.4 | |
| numpy/_core/src/multiarray/scalartypes.c.src | 4,879 | 70 | 18 | 4,889.5 | |
| numpy/_core/code_generators/ufunc_docstrings.py | 5,634 | 65 | 23 | 4,878.9 | |
| numpy/polynomial/hermite.py | 1,794 | 115 | 43 | 4,870.9 | |
| numpy/linalg/_linalg.py | 3,642 | 79 | 35 | 4,767.6 | |
| numpy/polynomial/laguerre.py | 1,729 | 114 | 41 | 4,740.3 | |
| numpy/polynomial/hermite_e.py | 1,692 | 115 | 42 | 4,730.4 | |
| numpy/polynomial/legendre.py | 1,655 | 116 | 43 | 4,719.1 | |
| numpy/f2py/rules.py | 1,680 | 114 | 33 | 4,672.6 | |
| numpy/lib/_function_base_impl.pyi | 3,756 | 72 | 16 | 4,412.6 | |
| numpy/_core/src/multiarray/descriptor.c | 4,050 | 69 | 21 | 4,391.1 | |
| numpy/lib/recfunctions.py | 1,681 | 107 | 38 | 4,387.0 | |
| numpy/lib/tests/test_arraysetops.py | 1,284 | 122 | 48 | 4,371.6 | |
| numpy/_core/src/multiarray/arraytypes.c.src | 4,930 | 61 | 18 | 4,283.1 | |
| numpy/tests/test_public_api.py | 722 | 154 | 42 | 4,138.0 | |
| doc/source/conf.py | 649 | 160 | 63 | 4,076.1 | |
| numpy/_core/src/multiarray/methods.c | 3,188 | 72 | 18 | 4,065.3 | |
| numpy/_core/numeric.py | 2,724 | 76 | 33 | 3,966.6 | |
| numpy/_core/src/multiarray/item_selection.c | 3,536 | 66 | 20 | 3,924.6 | |
| numpy/linalg/_linalg.pyi | 2,408 | 76 | 7 | 3,729.4 | |
| numpy/_core/src/multiarray/convert_datatype.c | 3,715 | 61 | 14 | 3,718.0 | |
| numpy/lib/tests/test_format.py | 1,059 | 112 | 43 | 3,644.7 | |
| numpy/_core/tests/test_nditer.py | 3,939 | 58 | 23 | 3,640.2 | |
| numpy/_core/src/umath/stringdtype_ufuncs.cpp | 3,188 | 63 | 12 | 3,557.1 | |
| doc/source/reference/c-api/types-and-structures.rst | 1,648 | 83 | 20 | 3,369.4 | |
| numpy/f2py/src/fortranobject.c | 1,454 | 86 | 29 | 3,279.3 | |
| numpy/_core/tests/test_regression.py | 2,672 | 63 | 23 | 3,256.6 | |
| numpy/lib/tests/test_nanfunctions.py | 1,460 | 84 | 32 | 3,209.6 | |
| pyproject.toml | 455 | 150 | 32 | 3,199.6 | |
| numpy/_core/tests/test_dtype.py | 2,480 | 64 | 26 | 3,187.2 | |
| numpy/_core/defchararray.py | 1,429 | 84 | 15 | 3,175.4 | |
| numpy/lib/_npyio_impl.py | 2,487 | 63 | 25 | 3,141.8 | |
| numpy/f2py/f2py2e.py | 755 | 112 | 34 | 3,077.5 | |
| numpy/typing/tests/data/reveal/ma.pyi | 1,225 | 86 | 4 | 3,010.0 | |
| numpy/random/_generator.pyi | 2,004 | 67 | 11 | 2,999.3 | |
| numpy/_core/src/umath/string_ufuncs.cpp | 2,075 | 65 | 12 | 2,960.9 | |
| .github/workflows/linux.yml | 454 | 137 | 25 | 2,919.1 | |
| .github/workflows/wheels.yml | 122 | 259 | 29 | 2,860.7 | |
| numpy/lib/_iotools.py | 900 | 95 | 28 | 2,850.0 | |
| numpy/_core/include/numpy/ndarraytypes.h | 2,085 | 62 | 18 | 2,831.0 | |
| numpy/_core/numeric.pyi | 1,898 | 64 | 10 | 2,788.2 | |
| .spin/cmds.py | 712 | 101 | 25 | 2,695.0 | |
| numpy/_core/src/multiarray/stringdtype/casts.cpp | 2,451 | 53 | 6 | 2,623.9 | |
| numpy/_core/tests/test_datetime.py | 3,367 | 45 | 21 | 2,611.2 | |
| numpy/_core/strings.py | 1,825 | 60 | 11 | 2,563.2 | |
| numpy/lib/tests/test_index_tricks.py | 703 | 94 | 35 | 2,492.3 | |
| numpy/_core/src/multiarray/datetime.c | 4,507 | 37 | 17 | 2,484.0 | |
| numpy/_core/src/umath/string_buffer.h | 1,705 | 60 | 9 | 2,477.5 | |
| numpy/ma/mrecords.py | 739 | 90 | 29 | 2,446.6 | |
| numpy/_core/tests/test_deprecations.py | 630 | 97 | 28 | 2,434.7 | |
| numpy/random/tests/test_randomstate.py | 2,107 | 53 | 19 | 2,432.8 | |
| doc/source/reference/arrays.classes.rst | 779 | 87 | 38 | 2,428.2 | |
| doc/source/user/quickstart.rst | 1,482 | 63 | 41 | 2,425.3 | |
| numpy/typing/tests/data/reveal/fromnumeric.pyi | 848 | 82 | 11 | 2,387.9 | |
| numpy/matrixlib/defmatrix.py | 1,117 | 70 | 33 | 2,339.5 | |
| numpy/linalg/umath_linalg.cpp | 4,844 | 33 | 16 | 2,296.8 | |
| numpy/_core/code_generators/generate_umath.py | 1,715 | 55 | 18 | 2,277.7 | |
| numpy/typing/tests/data/reveal/array_constructors.pyi | 803 | 80 | 7 | 2,267.0 | |
| numpy/linalg/lapack_lite/f2c_s_lapack.c | 41,690 | 11 | 7 | 2,246.0 | |
| numpy/lib/tests/test_shape_base.py | 813 | 78 | 33 | 2,224.0 | |
| numpy/__init__.cython-30.pxd | 1,312 | 61 | 16 | 2,209.5 | |
| numpy/lib/tests/test_recfunctions.py | 1,042 | 67 | 20 | 2,162.8 | |
| numpy/ma/tests/test_old_ma.py | 939 | 70 | 28 | 2,145.0 | |
| numpy/f2py/capi_maps.py | 813 | 75 | 34 | 2,138.5 |