omdev 0.0.0.dev287__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
@@ -171,7 +171,7 @@
171
171
  "module": ".py.scripts.execstat",
172
172
  "attr": "_CLI_MODULE",
173
173
  "file": "omdev/py/scripts/execstat.py",
174
- "line": 49,
174
+ "line": 82,
175
175
  "value": {
176
176
  "$.cli.types.CliModule": {
177
177
  "cmd_name": "py/execstat",
@@ -179,18 +179,6 @@
179
179
  }
180
180
  }
181
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"
191
- }
192
- }
193
- },
194
182
  {
195
183
  "module": ".py.scripts.importtrace",
196
184
  "attr": "_CLI_MODULE",
@@ -1,7 +1,9 @@
1
1
  #!/usr/bin/env python3
2
2
  # @omlish-script
3
+ import argparse
3
4
  import inspect
4
5
  import json
6
+ import statistics
5
7
  import subprocess
6
8
  import sys
7
9
 
@@ -12,34 +14,65 @@ import sys
12
14
  def _run(
13
15
  src: str,
14
16
  *,
15
- pre: str | None = None,
17
+ setup: str | None = None,
18
+ time: bool = False,
19
+ rss: bool = False,
20
+ modules: bool = False,
16
21
  ) -> dict:
17
- import resource # noqa
18
- import sys # noqa
19
- import time # noqa
22
+ if rss:
23
+ import resource # noqa
20
24
 
21
- def get_rss() -> int:
22
- return resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
25
+ def get_rss() -> int:
26
+ return resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
23
27
 
24
- if pre:
25
- exec(pre)
28
+ if time:
29
+ from time import monotonic as get_time
26
30
 
27
- start_modules = set(sys.modules)
28
- start_rss = get_rss()
29
- start_time = time.time()
31
+ if modules:
32
+ import sys # noqa
30
33
 
31
- exec(src)
34
+ def get_modules() -> set[str]:
35
+ return set(sys.modules)
32
36
 
33
- end_time = time.time()
34
- end_rss = get_rss()
35
- end_modules = set(sys.modules)
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
+ #
36
71
 
37
72
  return {
38
- 'time_ms': (time_ms := round((end_time - start_time) * 1000., 6)),
39
- 'time_ms_s': f'{time_ms:_}',
40
- 'rss': (rss := (end_rss - start_rss)),
41
- 'rss_s': f'{rss:_}',
42
- 'modules': sorted(end_modules - start_modules),
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
43
76
  }
44
77
 
45
78
 
@@ -54,26 +87,91 @@ _CLI_MODULE = {'$omdev.cli.types.CliModule': {
54
87
 
55
88
 
56
89
  def _main() -> None:
57
- if len(sys.argv) == 2:
58
- pre = None
59
- [src] = sys.argv[1:]
60
- elif len(sys.argv) == 3:
61
- [pre, src] = sys.argv[1:]
62
- else:
63
- raise Exception('Invalid arguments')
64
-
65
- payload = '\n'.join([
66
- inspect.getsource(_run),
67
- f'dct = _run({src!r}, pre={pre!r})',
68
- 'import json',
69
- 'print(json.dumps(dct))',
70
- ])
71
-
72
- out_json = subprocess.check_output([sys.executable, '-c', payload])
73
-
74
- dct = json.loads(out_json)
75
-
76
- print(json.dumps(dct, indent=2))
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))
77
175
 
78
176
 
79
177
  if __name__ == '__main__':
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omdev
3
- Version: 0.0.0.dev287
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.dev287
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=qU7B38qH7pnZcSvbdlaw7Of0MoWAWncs0tG2kFVtHAc,10673
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/execstat.py,sha256=Ly11ffRdo9aud4nnxJWe5MqRsO8lDEA5L9s0Ul09hJM,1544
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.dev287.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
263
- omdev-0.0.0.dev287.dist-info/METADATA,sha256=c9XD3IcAQAfiAlXPY8blNR97MF-_aJaozD6n_jvhJwI,1478
264
- omdev-0.0.0.dev287.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
265
- omdev-0.0.0.dev287.dist-info/entry_points.txt,sha256=dHLXFmq5D9B8qUyhRtFqTGWGxlbx3t5ejedjrnXNYLU,33
266
- omdev-0.0.0.dev287.dist-info/top_level.txt,sha256=1nr7j30fEWgLYHW3lGR9pkdHkb7knv1U1ES1XRNVQ6k,6
267
- omdev-0.0.0.dev287.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,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()