omdev 0.0.0.dev286__py3-none-any.whl → 0.0.0.dev288__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
omdev/.manifests.json CHANGED
@@ -168,26 +168,14 @@
168
168
  }
169
169
  },
170
170
  {
171
- "module": ".py.scripts.execrss",
171
+ "module": ".py.scripts.execstat",
172
172
  "attr": "_CLI_MODULE",
173
- "file": "omdev/py/scripts/execrss.py",
174
- "line": 11,
173
+ "file": "omdev/py/scripts/execstat.py",
174
+ "line": 82,
175
175
  "value": {
176
176
  "$.cli.types.CliModule": {
177
- "cmd_name": "py/execrss",
178
- "mod_name": "omdev.py.scripts.execrss"
179
- }
180
- }
181
- },
182
- {
183
- "module": ".py.scripts.exectime",
184
- "attr": "_CLI_MODULE",
185
- "file": "omdev/py/scripts/exectime.py",
186
- "line": 66,
187
- "value": {
188
- "$.cli.types.CliModule": {
189
- "cmd_name": "py/exectime",
190
- "mod_name": "omdev.py.scripts.exectime"
177
+ "cmd_name": "py/execstat",
178
+ "mod_name": "omdev.py.scripts.execstat"
191
179
  }
192
180
  }
193
181
  },
@@ -0,0 +1,178 @@
1
+ #!/usr/bin/env python3
2
+ # @omlish-script
3
+ import argparse
4
+ import inspect
5
+ import json
6
+ import statistics
7
+ import subprocess
8
+ import sys
9
+
10
+
11
+ ##
12
+
13
+
14
+ def _run(
15
+ src: str,
16
+ *,
17
+ setup: str | None = None,
18
+ time: bool = False,
19
+ rss: bool = False,
20
+ modules: bool = False,
21
+ ) -> dict:
22
+ if rss:
23
+ import resource # noqa
24
+
25
+ def get_rss() -> int:
26
+ return resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
27
+
28
+ if time:
29
+ from time import monotonic as get_time
30
+
31
+ if modules:
32
+ import sys # noqa
33
+
34
+ def get_modules() -> set[str]:
35
+ return set(sys.modules)
36
+
37
+ #
38
+
39
+ if setup:
40
+ exec(setup)
41
+
42
+ code = compile(src, '', 'exec')
43
+
44
+ #
45
+
46
+ if rss:
47
+ start_rss = get_rss() # noqa
48
+
49
+ if modules:
50
+ start_modules = get_modules() # noqa
51
+
52
+ if time:
53
+ start_time = get_time() # noqa
54
+
55
+ #
56
+
57
+ exec(code)
58
+
59
+ #
60
+
61
+ if time:
62
+ end_time = get_time()
63
+
64
+ if rss:
65
+ end_rss = get_rss()
66
+
67
+ if modules:
68
+ end_modules = get_modules()
69
+
70
+ #
71
+
72
+ return {
73
+ **({'time': (end_time - start_time)} if time else {}), # noqa
74
+ **({'rss': (end_rss - start_rss)} if rss else {}), # noqa
75
+ **({'modules': sorted(end_modules - start_modules)} if modules else {}), # noqa
76
+ }
77
+
78
+
79
+ #
80
+
81
+
82
+ # @omlish-manifest
83
+ _CLI_MODULE = {'$omdev.cli.types.CliModule': {
84
+ 'cmd_name': 'py/execstat',
85
+ 'mod_name': __name__,
86
+ }}
87
+
88
+
89
+ def _main() -> None:
90
+ parser = argparse.ArgumentParser()
91
+
92
+ parser.add_argument('src')
93
+ parser.add_argument('-s', '--setup')
94
+
95
+ parser.add_argument('-t', '--time', action='store_true')
96
+ parser.add_argument('-r', '--rss', action='store_true')
97
+ parser.add_argument('-m', '--modules', action='store_true')
98
+
99
+ parser.add_argument('-n', '--num-runs', type=int, default=1)
100
+
101
+ parser.add_argument('-P', '--precision', type=int, default=3)
102
+
103
+ parser.add_argument('-x', '--exe')
104
+
105
+ args = parser.parse_args()
106
+
107
+ if (n := args.num_runs) < 1:
108
+ raise ValueError('num-runs must be > 0')
109
+
110
+ prec = args.precision
111
+
112
+ #
113
+
114
+ if (exe := args.exe) is None:
115
+ exe = sys.executable
116
+
117
+ results = []
118
+ for i in range(n):
119
+ run_kw = dict(
120
+ src=args.src,
121
+ setup=args.setup,
122
+ time=bool(args.time),
123
+ )
124
+
125
+ if i == 0:
126
+ run_kw.update(
127
+ rss=bool(args.rss),
128
+ modules=bool(args.modules),
129
+ )
130
+
131
+ payload = '\n'.join([
132
+ inspect.getsource(_run),
133
+ f'dct = _run(**{run_kw!r})',
134
+ 'import json',
135
+ 'print(json.dumps(dct))',
136
+ ])
137
+
138
+ result = json.loads(subprocess.check_output([exe, '-c', payload]))
139
+
140
+ results.append(result)
141
+
142
+ #
143
+
144
+ out = {}
145
+
146
+ if args.time:
147
+ if n > 1:
148
+ ts = [r['time'] * 1000. for r in results]
149
+ out.update({
150
+ 'time_ms_mean': (time_ms_mean := round(statistics.mean(ts), prec)),
151
+ 'time_ms_mean_s': f'{time_ms_mean:_}',
152
+ 'time_ms_median': (time_ms_median := round(statistics.median(ts), prec)),
153
+ 'time_ms_median_s': f'{time_ms_median:_}',
154
+ 'time_ms_quantiles': (time_ms_quantiles := [round(tq, prec) for tq in statistics.quantiles(ts)]),
155
+ 'time_ms_quantiles_s': [f'{tq:_}' for tq in time_ms_quantiles],
156
+ })
157
+ else:
158
+ out.update({
159
+ 'time_ms': (time_ms := round(results[0]['time'] * 1000., prec)),
160
+ 'time_ms_s': f'{time_ms:_}',
161
+ })
162
+
163
+ if args.rss:
164
+ out.update({
165
+ 'rss': (rss := results[0]['rss']),
166
+ 'rss_s': f'{rss:_}',
167
+ })
168
+
169
+ if args.modules:
170
+ out.update({
171
+ 'modules': results[0]['modules'],
172
+ })
173
+
174
+ print(json.dumps(out, indent=2))
175
+
176
+
177
+ if __name__ == '__main__':
178
+ _main()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omdev
3
- Version: 0.0.0.dev286
3
+ Version: 0.0.0.dev288
4
4
  Summary: omdev
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -12,7 +12,7 @@ Classifier: Operating System :: OS Independent
12
12
  Classifier: Operating System :: POSIX
13
13
  Requires-Python: >=3.12
14
14
  License-File: LICENSE
15
- Requires-Dist: omlish==0.0.0.dev286
15
+ Requires-Dist: omlish==0.0.0.dev288
16
16
  Provides-Extra: all
17
17
  Requires-Dist: black~=25.1; extra == "all"
18
18
  Requires-Dist: pycparser~=2.22; extra == "all"
@@ -1,4 +1,4 @@
1
- omdev/.manifests.json,sha256=itAg3qiuZHPqPj0Eb1rvKeRsuhQ8VeoZTPTsZ5aVc-U,10669
1
+ omdev/.manifests.json,sha256=zmYuVLzazV03KggE8ZqY0MlVvpEwChvCWh_wfCSEn3w,10394
2
2
  omdev/__about__.py,sha256=OgO_8azOzKriF2qPeDWRLcRe9p1XW5kYdJCq5vewff0,1171
3
3
  omdev/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  omdev/cmake.py,sha256=9rfSvFHPmKDj9ngvfDB2vK8O-xO_ZwUm7hMKLWA-yOw,4578
@@ -201,8 +201,7 @@ omdev/py/findimports.py,sha256=V3GcFhqYOiPQtAOpTi4Pmeb3_c5mKqlEwah7v9vCBjg,2476
201
201
  omdev/py/srcheaders.py,sha256=cMopJr-QpOmzEBow-4mVupxdULE8QdSaSLH2aJV5Xxg,1993
202
202
  omdev/py/scripts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
203
203
  omdev/py/scripts/bumpversion.py,sha256=2NnfRsJiZNTg-LubIwXCm2vklG7-kIR8_xFUEZNxtiY,1119
204
- omdev/py/scripts/execrss.py,sha256=mR0G0wERBYtQmVIn63lCIIFb5zkCM6X_XOENDFYDBKc,651
205
- omdev/py/scripts/exectime.py,sha256=S2O4MgtzTsFOY2IUJxsrnOIame9tEFc6aOlKP-F1JSg,1541
204
+ omdev/py/scripts/execstat.py,sha256=eyk_TCeJt-xtMGqaW3X7pnEBe7JZbXrTYsODn_m6lfM,3869
206
205
  omdev/py/scripts/importtrace.py,sha256=NjRilVNBugswrNflIhPCPHRTd-vIijqSZ8C7J8lariI,14038
207
206
  omdev/py/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
208
207
  omdev/py/tools/importscan.py,sha256=4dCH0coX0OqNwesteKaTE8GxuSfLhgXYQlzNUXLiSNY,4640
@@ -259,9 +258,9 @@ omdev/tools/json/rendering.py,sha256=tMcjOW5edfozcMSTxxvF7WVTsbYLoe9bCKFh50qyaGw
259
258
  omdev/tools/pawk/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
260
259
  omdev/tools/pawk/__main__.py,sha256=VCqeRVnqT1RPEoIrqHFSu4PXVMg4YEgF4qCQm90-eRI,66
261
260
  omdev/tools/pawk/pawk.py,sha256=zsEkfQX0jF5bn712uqPAyBSdJt2dno1LH2oeSMNfXQI,11424
262
- omdev-0.0.0.dev286.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
263
- omdev-0.0.0.dev286.dist-info/METADATA,sha256=IzjfM0MT5p1WggRTYQ5Q9ZXsStyITdl9yYt0WWcgtcw,1478
264
- omdev-0.0.0.dev286.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
265
- omdev-0.0.0.dev286.dist-info/entry_points.txt,sha256=dHLXFmq5D9B8qUyhRtFqTGWGxlbx3t5ejedjrnXNYLU,33
266
- omdev-0.0.0.dev286.dist-info/top_level.txt,sha256=1nr7j30fEWgLYHW3lGR9pkdHkb7knv1U1ES1XRNVQ6k,6
267
- omdev-0.0.0.dev286.dist-info/RECORD,,
261
+ omdev-0.0.0.dev288.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
262
+ omdev-0.0.0.dev288.dist-info/METADATA,sha256=n_qLz-pv3lbroeIziTVCwPNh81awUanZKBO4BoS7WpU,1478
263
+ omdev-0.0.0.dev288.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
264
+ omdev-0.0.0.dev288.dist-info/entry_points.txt,sha256=dHLXFmq5D9B8qUyhRtFqTGWGxlbx3t5ejedjrnXNYLU,33
265
+ omdev-0.0.0.dev288.dist-info/top_level.txt,sha256=1nr7j30fEWgLYHW3lGR9pkdHkb7knv1U1ES1XRNVQ6k,6
266
+ omdev-0.0.0.dev288.dist-info/RECORD,,
@@ -1,37 +0,0 @@
1
- #!/usr/bin/env python3
2
- # @omlish-script
3
- import resource
4
- import sys
5
-
6
-
7
- def _get_rss() -> int:
8
- return resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
9
-
10
-
11
- # @omlish-manifest
12
- _CLI_MODULE = {'$omdev.cli.types.CliModule': {
13
- 'cmd_name': 'py/execrss',
14
- 'mod_name': __name__,
15
- }}
16
-
17
-
18
- def _main() -> None:
19
- if len(sys.argv) == 2:
20
- pre = None
21
- [src] = sys.argv[1:]
22
- elif len(sys.argv) == 3:
23
- [pre, src] = sys.argv[1:]
24
- else:
25
- raise Exception('Invalid arguments')
26
-
27
- if pre:
28
- exec(pre)
29
-
30
- start = _get_rss()
31
- exec(src)
32
- end = _get_rss()
33
- print(end - start)
34
-
35
-
36
- if __name__ == '__main__':
37
- _main()
@@ -1,106 +0,0 @@
1
- #!/usr/bin/env python3
2
- # @omlish-script
3
-
4
-
5
- ##
6
-
7
-
8
- def _run_one(src, pre=None):
9
- import time
10
-
11
- if pre:
12
- exec(pre)
13
-
14
- co = compile(src, '<string>', 'exec')
15
- start = time.time_ns()
16
- exec(co)
17
- end = time.time_ns()
18
-
19
- return end - start
20
-
21
-
22
- ##
23
-
24
-
25
- def _run(n, src, pre=None):
26
- if n is None:
27
- return _run_one(src, pre=pre)
28
-
29
- #
30
-
31
- import inspect
32
-
33
- cmd = '\n'.join([
34
- inspect.getsource(_run_one),
35
- f'print(_run_one({src!r}, pre={pre!r}))',
36
- ])
37
-
38
- #
39
-
40
- import subprocess
41
- import sys
42
-
43
- ts = []
44
- for _ in range(n):
45
- out = subprocess.check_output([sys.executable, '-c', cmd]).decode()
46
- t = int(out.strip())
47
- ts.append(t)
48
-
49
- #
50
-
51
- import statistics
52
-
53
- o = {
54
- # 'times': ts,
55
- 'mean': statistics.mean(ts),
56
- 'median': statistics.median(ts),
57
- 'quantiles': statistics.quantiles(ts),
58
- }
59
-
60
- return o
61
-
62
-
63
- ##
64
-
65
-
66
- # @omlish-manifest
67
- _CLI_MODULE = {'$omdev.cli.types.CliModule': {
68
- 'cmd_name': 'py/exectime',
69
- 'mod_name': __name__,
70
- }}
71
-
72
-
73
- def _main():
74
- import sys
75
-
76
- args = sys.argv[1:]
77
-
78
- n = None
79
- if args:
80
- try:
81
- n = int(args[0])
82
- except ValueError:
83
- pass
84
- else:
85
- args.pop(0)
86
-
87
- if len(args) > 1:
88
- pre = args.pop(0)
89
- else:
90
- pre = None
91
-
92
- if len(args) != 1:
93
- raise Exception('Invalid arguments')
94
- [src] = args
95
-
96
- #
97
-
98
- o = _run(n, src, pre=pre)
99
-
100
- import json
101
-
102
- print(json.dumps(o, indent=2))
103
-
104
-
105
- if __name__ == '__main__':
106
- _main()