Closed
Description
Bug report
Bug description:
Comparing Python 3.11.4 with 3.12.0rc1 I see a substantial slowdown of dictionary operations (update, copy, items, get). Build is from source on Ubuntu 20.04 using gcc/g++ 9.4.0, with configure options --enable-shared and --enable-optimizations. The NumPy version in both cases is 1.25.2 with linkage to mkl 2023.2.0.
Profiling results for my application are as follows:
Python 3.12.0rc1:
Wed Sep 6 18:55:23 2023 profile.binfile
27271926 function calls (26072328 primitive calls) in 20.862 seconds
Ordered by: internal time
List reduced from 520 to 50 due to restriction <50>
ncalls tottime percall cumtime percall filename:lineno(function)
7045 4.000 0.001 5.031 0.001 digraph.py:469(add_nodes_from)
7045 3.003 0.000 5.198 0.001 digraph.py:713(add_edges_from)
7056013 1.952 0.000 2.093 0.000 {method 'update' of 'dict' objects}
1765 1.304 0.001 1.351 0.001 core.py:7090(concatenate)
1232480 0.752 0.000 1.121 0.000 reportviews.py:788(<genexpr>)
91026 0.699 0.000 1.069 0.000 resolver.py:92(Define)
203489 0.645 0.000 1.167 0.000 core.py:2952(_update_from)
41601 0.568 0.000 0.581 0.000 device.py:157(Default)
41601 0.479 0.000 0.917 0.000 mnaindexer.py:238(SetIndexing)
2 0.405 0.203 0.469 0.234 mnaloader.py:95(SetLinearTerms)
1495228 0.326 0.000 0.326 0.000 {method 'copy' of 'dict' objects}
83202 0.320 0.000 0.558 0.000 device.py:40(SetSocket)
1496872 0.311 0.000 0.311 0.000 {method 'items' of 'dict' objects}
1626268 0.308 0.000 0.308 0.000 {method 'get' of 'dict' objects}
Python 3.11.4:
Wed Sep 6 18:54:04 2023 profile.binfile
27569104 function calls (26369506 primitive calls) in 16.836 seconds
Ordered by: internal time
List reduced from 541 to 50 due to restriction <50>
ncalls tottime percall cumtime percall filename:lineno(function)
7045 4.409 0.001 4.802 0.001 digraph.py:469(add_nodes_from)
7045 1.576 0.000 2.972 0.000 digraph.py:713(add_edges_from)
1765 1.337 0.001 1.380 0.001 core.py:7090(concatenate)
1232480 0.767 0.000 0.961 0.000 reportviews.py:788(<genexpr>)
7056013 0.765 0.000 0.881 0.000 {method 'update' of 'dict' objects}
91026 0.520 0.000 0.787 0.000 resolver.py:92(Define)
203489 0.486 0.000 0.721 0.000 core.py:2952(_update_from)
41601 0.464 0.000 0.464 0.000 device.py:37(<dictcomp>)
41601 0.369 0.000 0.704 0.000 mnaindexer.py:238(SetIndexing)
2 0.331 0.165 0.413 0.206 mnaloader.py:95(SetLinearTerms)
83202 0.312 0.000 0.402 0.000 device.py:40(SetSocket)
93800 0.270 0.000 1.559 0.000 core.py:3217(__getitem__)
43368 0.206 0.000 1.698 0.000 resolver.py:233(Connect)
1332528/332816 0.186 0.000 0.187 0.000 cell.py:20(GetDevices)
267312 0.182 0.000 0.182 0.000 {built-in method numpy.array}
104392 0.178 0.000 0.722 0.000 core.py:2978(__array_finalize__)
1 0.148 0.148 0.921 0.921 mnamethod.py:276(SetLinearDeviceRulesIndexing)
351240 0.129 0.000 0.839 0.000 {function MaskedArray.view at 0x7fc262658540}
1227200 0.112 0.000 0.112 0.000 reportviews.py:774(<lambda>)
1765/1 0.110 0.000 12.163 12.163 resolver.py:350(Build)
1663235 0.109 0.000 0.109 0.000 {built-in method builtins.getattr}
41601 0.105 0.000 0.162 0.000 mnaindexer.py:268(SetMatrixConstructionIndexing)
1496872 0.101 0.000 0.101 0.000 {method 'items' of 'dict' objects}
1643874 0.099 0.000 0.099 0.000 {method 'get' of 'dict' objects}
5292/12 0.098 0.000 0.743 0.062 cell.py:275(SetParameters)
1495228 0.098 0.000 0.098 0.000 {method 'copy' of 'dict' objects}
The slowdowns in networkx digraph class methods add_edges_from(), in particular, and add_nodes_from() are likely caused by the performance degradation of the python dictionary methods.
CPython versions tested on:
3.12
Operating systems tested on:
Linux
Metadata
Metadata
Assignees
Labels
Projects
Status
Done