| 55 | | |
| | 55 | ---- |
| | 56 | {{{ |
| | 57 | dict.get("x") |
| | 58 | }}} |
| | 59 | is significantly slower than |
| | 60 | {{{ |
| | 61 | dict["x"] |
| | 62 | }}} |
| | 63 | |
| | 64 | but...the construction: |
| | 65 | {{{ |
| | 66 | y = dict.get("x", None) |
| | 67 | if y: |
| | 68 | }}} |
| | 69 | is as fast as |
| | 70 | {{{ |
| | 71 | if x in dict: |
| | 72 | y = dict["x"] |
| | 73 | }}} |
| | 74 | |
| | 75 | Also, keys() is slowing things down. |
| | 76 | {{{ |
| | 77 | if a in dict.keys() |
| | 78 | }}} |
| | 79 | is ~25% slower than: |
| | 80 | {{{ |
| | 81 | if a in dict |
| | 82 | }}} |
| | 83 | |
| | 84 | Another thing is that the profiler showed that there is extensive use of |
| | 85 | isinstance. So I tried to find an alternative, which would be: |
| | 86 | {{{ |
| | 87 | if type(x) == "yyy" |
| | 88 | }}} |
| | 89 | In fact, this is ~30% faster than isinstance, but it won't find subclasses. |
| | 90 | So, if you test for: |
| | 91 | {{{ |
| | 92 | if isinstance(x, dict) |
| | 93 | }}} |
| | 94 | and want Storages to match, then you cannot replace isinstance. |
| | 95 | |
| | 96 | A real killer is hasattr(). |
| | 97 | I ran 5 million loops of |
| | 98 | {{{ |
| | 99 | if "a" in dict: |
| | 100 | }}} |
| | 101 | vs. |
| | 102 | {{{ |
| | 103 | if hasattr(dict, "a") |
| | 104 | }}} |
| | 105 | which was 4.5s vs. 12s. |
| | 106 | |
| | 107 | Hence - for dicts, avoid hasattr to test for containment. |
| | 108 | ---- |