mirror of
https://github.com/zebrajr/pytorch.git
synced 2025-12-07 00:21:07 +01:00
This PR changes the empty collection factory call to Python literals:
- `list()` -> `[]`
- `tuple()` -> `()`
- `dict()` -> `{}`
The Python literals are more performant and safer. For example, the bytecode for building an empty dictionary:
```bash
$ python3 -m dis - <<EOS
import collections
d1 = {}
d2 = dict()
dict = collections.OrderedDict
d3 = dict()
EOS
```
```text
0 0 RESUME 0
1 2 LOAD_CONST 0 (0)
4 LOAD_CONST 1 (None)
6 IMPORT_NAME 0 (collections)
8 STORE_NAME 0 (collections)
3 10 BUILD_MAP 0
12 STORE_NAME 1 (d1)
4 14 PUSH_NULL
16 LOAD_NAME 2 (dict)
18 CALL 0
26 STORE_NAME 3 (d2)
6 28 LOAD_NAME 0 (collections)
30 LOAD_ATTR 8 (OrderedDict)
50 STORE_NAME 2 (dict)
7 52 PUSH_NULL
54 LOAD_NAME 2 (dict)
56 CALL 0
64 STORE_NAME 5 (d3)
66 RETURN_CONST 1 (None)
```
The dict literal `{}` only has one bytecode `BUILD_MAP`, while the factory call `dict()` has three `PUSH_NULL + LOAD_NAME + CALL`. Also, the factory call is not safe if users override the `dict` name in `locals` or `globals` (see the example of replacing with `OrderedDict` above).
Pull Request resolved: https://github.com/pytorch/pytorch/pull/130199
Approved by: https://github.com/malfet
27 lines
657 B
Python
27 lines
657 B
Python
# mypy: allow-untyped-defs
|
|
import threading
|
|
from typing import Any, Dict
|
|
|
|
import torch._C._lazy
|
|
|
|
|
|
class DeviceContext:
|
|
_CONTEXTS: Dict[str, Any] = {}
|
|
_CONTEXTS_LOCK = threading.Lock()
|
|
|
|
def __init__(self, device):
|
|
self.device = device
|
|
|
|
|
|
def get_device_context(device=None):
|
|
if device is None:
|
|
device = torch._C._lazy._get_default_device_type()
|
|
else:
|
|
device = str(device)
|
|
with DeviceContext._CONTEXTS_LOCK:
|
|
devctx = DeviceContext._CONTEXTS.get(device, None)
|
|
if devctx is None:
|
|
devctx = DeviceContext(device)
|
|
DeviceContext._CONTEXTS[device] = devctx
|
|
return devctx
|