[{"data":1,"prerenderedAt":269},["ShallowReactive",2],{"algo-python-mesh-boolean-libraries-2026":3},{"id":4,"title":5,"author":6,"body":7,"date":241,"description":242,"extension":243,"keywords":244,"meta":255,"navigation":256,"path":257,"published":256,"seo":258,"stem":260,"tags":261,"__hash__":268},"algorithms\u002Falgorithms\u002Fpython-mesh-boolean-libraries-2026.md","Comparison and Benchmarks of Python Mesh Boolean Libraries at Industry Scale — 2026","Žiga Sajovic",{"type":8,"value":9,"toc":234},"minimark",[10,28,36,39,46,55,77,81,86,131,134,138,146,152,167,173,177,180,187,193,200,206,230],[11,12,13],"note",{},[14,15,16,17,22,23,27],"p",{},"Part of a series on the same Thingi10K corpus, also measured for ",[18,19,21],"a",{"href":20},"\u002Falgorithms\u002Fbenchmarking-mesh-boolean-libraries-2026","native C++ and eight libraries"," and ",[18,24,26],{"href":25},"\u002Falgorithms\u002Fbrowser-mesh-boolean-libraries-2026","in the browser",".",[14,29,30,31,35],{},"Python is where mesh geometry gets scripted — scientific computing, CAD automation, slicing and additive-manufacturing prep, simulation meshing, ML data pipelines. The boolean is the workhorse: union, intersection, difference. At industry scale — 200K to 1.5M polygons per operand — the library you ",[32,33,34],"code",{},"pip install"," decides whether that runs in tens of milliseconds or seconds.",[14,37,38],{},"Three pip-installable mesh boolean libraries on the Thingi10K corpus: trueform, MeshLib, and Manifold. Each through its official Python package, default install, default thread count. Timings are arrays-in to arrays-out — NumPy vertices and triangles in, the same out — the cost a Python program actually pays.",[40,41],"corpus-grid",{":columns":42,":images":43,"detail":44,"title":45},"5","[\"\u002Fimg\u002Falgorithms\u002Fcorpus\u002Fthumb_0184.png\",\"\u002Fimg\u002Falgorithms\u002Fcorpus\u002Fthumb_0096.png\",\"\u002Fimg\u002Falgorithms\u002Fcorpus\u002Fthumb_0998.png\",\"\u002Fimg\u002Falgorithms\u002Fcorpus\u002Fthumb_0715.png\",\"\u002Fimg\u002Falgorithms\u002Fcorpus\u002Fthumb_0404.png\",\"\u002Fimg\u002Falgorithms\u002Fcorpus\u002Fthumb_0464.png\",\"\u002Fimg\u002Falgorithms\u002Fcorpus\u002Fthumb_0846.png\",\"\u002Fimg\u002Falgorithms\u002Fcorpus\u002Fthumb_0060.png\",\"\u002Fimg\u002Falgorithms\u002Fcorpus\u002Fthumb_0444.png\",\"\u002Fimg\u002Falgorithms\u002Fcorpus\u002Fthumb_0506.png\",\"\u002Fimg\u002Falgorithms\u002Fcorpus\u002Fthumb_0573.png\",\"\u002Fimg\u002Falgorithms\u002Fcorpus\u002Fthumb_0049.png\",\"\u002Fimg\u002Falgorithms\u002Fcorpus\u002Fthumb_0226.png\",\"\u002Fimg\u002Falgorithms\u002Fcorpus\u002Fthumb_0963.png\",\"\u002Fimg\u002Falgorithms\u002Fcorpus\u002Fthumb_0879.png\",\"\u002Fimg\u002Falgorithms\u002Fcorpus\u002Fthumb_0307.png\",\"\u002Fimg\u002Falgorithms\u002Fcorpus\u002Fthumb_0931.png\",\"\u002Fimg\u002Falgorithms\u002Fcorpus\u002Fthumb_0381.png\",\"\u002Fimg\u002Falgorithms\u002Fcorpus\u002Fthumb_0061.png\",\"\u002Fimg\u002Falgorithms\u002Fcorpus\u002Fthumb_0548.png\",\"\u002Fimg\u002Falgorithms\u002Fcorpus\u002Fthumb_0246.png\",\"\u002Fimg\u002Falgorithms\u002Fcorpus\u002Fthumb_0074.png\",\"\u002Fimg\u002Falgorithms\u002Fcorpus\u002Fthumb_0596.png\",\"\u002Fimg\u002Falgorithms\u002Fcorpus\u002Fthumb_0950.png\",\"\u002Fimg\u002Falgorithms\u002Fcorpus\u002Fthumb_0370.png\"]","25 of 1,000 Thingi10K pairs · 200K–1.5M polygons · two operands overlaid","The corpus",[14,47,48],{},[49,50,51,52,54],"strong",{},"Of the libraries you can ",[32,53,34],{},", trueform is the fastest mesh boolean in Python.",[56,57,58,65,71],"ul",{},[59,60,61,64],"li",{},[49,62,63],{},"18 ms median",", fastest on every one of the 1000 pairs — 4.9× MeshLib, 6.9× Manifold (geometric mean).",[59,66,67,70],{},[49,68,69],{},"Valid on all 1000 pairs"," — closed and manifold. Manifold matches it; MeshLib is valid on 999.",[59,72,73,76],{},[49,74,75],{},"Same solid every time"," — signed volumes agree across all three.",[78,79],"article-cta",{":buttons":80},"[{\"label\":\"trueform\",\"to\":\"\u002Ftrueform\",\"icon\":\"i-lucide-cpu\",\"variant\":\"soft\",\"color\":\"neutral\"},{\"label\":\"Try it live\",\"to\":\"https:\u002F\u002Ftrueform.polydera.com\u002Flive-examples\u002Fboolean\",\"icon\":\"i-lucide-play\",\"variant\":\"soft\",\"color\":\"neutral\"},{\"label\":\"GitHub\",\"to\":\"https:\u002F\u002Fgithub.com\u002Fpolydera\u002Ftrueform\",\"icon\":\"i-simple-icons-github\",\"variant\":\"soft\",\"color\":\"neutral\"},{\"label\":\"Lunar\",\"to\":\"\u002Flunar\",\"icon\":\"i-lucide-moon\",\"variant\":\"soft\",\"color\":\"neutral\"}]",[82,83,85],"h2",{"id":84},"the-libraries","The libraries",[56,87,88,102,117],{},[59,89,90,97,98,101],{},[49,91,92,96],{},[18,93,95],{"href":94},"\u002Ftrueform","trueform"," 0.9.8"," — ",[32,99,100],{},"pip install trueform",". Topologically-exact arrangements over a bounded integer kernel. The boolean runs in C++; NumPy in, NumPy out.",[59,103,104,97,113,116],{},[49,105,106,112],{},[18,107,111],{"href":108,"rel":109},"https:\u002F\u002Fmeshlib.io\u002F",[110],"nofollow","MeshLib"," 3.1",[32,114,115],{},"pip install meshlib",". Simulation of Simplicity for degeneracy handling.",[59,118,119,97,127,130],{},[49,120,121,126],{},[18,122,125],{"href":123,"rel":124},"https:\u002F\u002Fgithub.com\u002Felalish\u002Fmanifold",[110],"Manifold"," 3.5",[32,128,129],{},"pip install manifold3d",". Deterministic floating point with symbolic perturbation.",[14,132,133],{},"All three are native cores (C++\u002FRust) with Python bindings — this is the speed the package gives you, not a pure-Python reimplementation.",[82,135,137],{"id":136},"protocol","Protocol",[14,139,140,141,145],{},"Each library is timed from input arrays to output arrays of the same shape. Native-object construction — where MeshLib and Manifold build their acceleration structures, and trueform builds its tree, face-membership, and manifold-edge link — ",[142,143,144],"em",{},"plus"," the boolean, all inside the timer. Only file I\u002FO is outside. Best of 5, fresh objects every run; nothing amortised across calls.",[14,147,148,151],{},[49,149,150],{},"Result agreement."," On every pair the three produced the same solid — signed volumes agree within floating-point tolerance. trueform and Manifold returned a closed, manifold mesh on all 1000 pairs; MeshLib on 999. The comparison is wall-clock only.",[14,153,154,157,158,161,162,27],{},[49,155,156],{},"Corpus."," Random sets of solid, manifold, non-self-intersecting Thingi10K meshes, 200K to 1.5M polygons per operand. Each operand is normalised to unit extent, randomly rotated, and translated so the bounding boxes overlap; each pair takes the union. The same 1000-pair corpus as the ",[18,159,160],{"href":20},"native benchmark","; Thingi10K IDs and per-operand counts are ",[18,163,166],{"href":164,"rel":165},"https:\u002F\u002Fgithub.com\u002Fpolydera\u002Ftrueform\u002Fblob\u002Fmain\u002Fresearch\u002Funcertainty-aware-mesh-csg\u002Fdata\u002Fpairwise-corpus-ids.json",[110],"published",[14,168,169,172],{},[49,170,171],{},"Environment."," Apple M4 Max (arm64), macOS, CPython 3.13. Installed from PyPI: trueform 0.9.8, meshlib 3.1.0.75, manifold3d 3.5.1 — default builds, default thread count. (On Apple Silicon the wheel's compiled architecture matters; all three ship native arm64 builds.)",[82,174,176],{"id":175},"pairwise-booleans","Pairwise booleans",[14,178,179],{},"One union per pair across the 1000-pair corpus. trueform is fastest on every one of them. The time axis is linear — the gap between violins is the real time difference, not a log-compressed one.",[14,181,182],{},[183,184],"img",{"alt":185,"src":186},"Python pairwise mesh boolean benchmark","\u002Fimg\u002Falgorithms\u002Fbenchmark-pairwise-python-2026.png",[188,189],"data-table",{":headers":190,":highlight":191,":rows":192},"[\"library\",\"median (ms)\",\"geomean × vs trueform\",\"valid \u002F 1000\"]","0","[[\"trueform 0.9.8\",\"18.0\",\"1.0×\",\"1000\"],[\"MeshLib 3.1\",\"87.6\",\"4.9×\",\"999\"],[\"Manifold 3.5\",\"120.3\",\"6.9×\",\"1000\"]]",[14,194,195,196,199],{},"trueform clusters tight around 18 ms. MeshLib and Manifold spread up the axis — five-to-seven times slower in the middle, with heavier tails. The win is not on average: trueform was the fastest of the three on ",[49,197,198],{},"every"," pair of the 1000.",[14,201,202,203,27],{},"These trueform numbers are the Python binding; the boolean itself runs in C++, so the native driver is faster again (15.7 ms median). The full eight-library comparison — adding CGAL, Geogram, Cherchi, Solidean, and the in-browser WebAssembly build, with N-ary scaling to N=64 — is in ",[18,204,205],{"href":20},"the industry-scale benchmark",[14,207,208,210,211,210,216,210,220,210,225],{},[18,209,95],{"href":94}," · ",[18,212,215],{"href":213,"rel":214},"https:\u002F\u002Ftrueform.polydera.com\u002Flive-examples\u002Fboolean",[110],"Try it live",[18,217,219],{"href":218},"\u002Flunar","Lunar",[18,221,224],{"href":222,"rel":223},"https:\u002F\u002Fgithub.com\u002Fpolydera\u002Ftrueform",[110],"GitHub",[18,226,229],{"href":227,"rel":228},"https:\u002F\u002Ftrueform.polydera.com",[110],"Documentation",[231,232],"cite-as",{"author":233,"title":5},"Sajovic, {\\v{Z}}iga",{"title":235,"searchDepth":236,"depth":236,"links":237},"",2,[238,239,240],{"id":84,"depth":236,"text":85},{"id":136,"depth":236,"text":137},{"id":175,"depth":236,"text":176},"2026-06-29","Three pip-installable mesh boolean libraries on the Thingi10K corpus at 200K–1.5M polygons per operand: trueform, MeshLib, Manifold. trueform is the fastest tested in Python — 18 ms median, 4.9× MeshLib, 6.9× Manifold (geometric mean), fastest on all 1000 pairs.","md",[245,246,247,248,249,250,251,252,253,254],"python mesh boolean","fastest python mesh boolean library","meshlib vs manifold","python CSG library","manifold3d benchmark","meshlib benchmark","trueform python","mesh boolean python","pip mesh boolean","python mesh boolean comparison",{},true,"\u002Falgorithms\u002Fpython-mesh-boolean-libraries-2026",{"title":259,"description":242},"Python Mesh Boolean Library Comparison and Benchmarks — 2026","algorithms\u002Fpython-mesh-boolean-libraries-2026",[262,263,264,265,266,267],"csg","booleans","benchmarks","performance","comparison","python","LoGwSKBhJRuCeQP4QOJa5579RDdmjyi8p_fuKEFLZtE",1786950767800]