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 +1 -13
- omdev/py/scripts/execstat.py +138 -40
- {omdev-0.0.0.dev287.dist-info → omdev-0.0.0.dev288.dist-info}/METADATA +2 -2
- {omdev-0.0.0.dev287.dist-info → omdev-0.0.0.dev288.dist-info}/RECORD +8 -9
- omdev/py/scripts/exectime.py +0 -106
- {omdev-0.0.0.dev287.dist-info → omdev-0.0.0.dev288.dist-info}/WHEEL +0 -0
- {omdev-0.0.0.dev287.dist-info → omdev-0.0.0.dev288.dist-info}/entry_points.txt +0 -0
- {omdev-0.0.0.dev287.dist-info → omdev-0.0.0.dev288.dist-info}/licenses/LICENSE +0 -0
- {omdev-0.0.0.dev287.dist-info → omdev-0.0.0.dev288.dist-info}/top_level.txt +0 -0
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":
|
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",
|
omdev/py/scripts/execstat.py
CHANGED
@@ -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
|
-
|
17
|
+
setup: str | None = None,
|
18
|
+
time: bool = False,
|
19
|
+
rss: bool = False,
|
20
|
+
modules: bool = False,
|
16
21
|
) -> dict:
|
17
|
-
|
18
|
-
|
19
|
-
import time # noqa
|
22
|
+
if rss:
|
23
|
+
import resource # noqa
|
20
24
|
|
21
|
-
|
22
|
-
|
25
|
+
def get_rss() -> int:
|
26
|
+
return resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
|
23
27
|
|
24
|
-
if
|
25
|
-
|
28
|
+
if time:
|
29
|
+
from time import monotonic as get_time
|
26
30
|
|
27
|
-
|
28
|
-
|
29
|
-
start_time = time.time()
|
31
|
+
if modules:
|
32
|
+
import sys # noqa
|
30
33
|
|
31
|
-
|
34
|
+
def get_modules() -> set[str]:
|
35
|
+
return set(sys.modules)
|
32
36
|
|
33
|
-
|
34
|
-
|
35
|
-
|
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
|
-
'
|
39
|
-
'
|
40
|
-
'
|
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
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
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.
|
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.
|
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=
|
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=
|
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.
|
263
|
-
omdev-0.0.0.
|
264
|
-
omdev-0.0.0.
|
265
|
-
omdev-0.0.0.
|
266
|
-
omdev-0.0.0.
|
267
|
-
omdev-0.0.0.
|
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,,
|
omdev/py/scripts/exectime.py
DELETED
@@ -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()
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|