Skip to content

Commit d2a635f

Browse files
committed
python: optimize some large string appends
1 parent 6a4e233 commit d2a635f

File tree

2 files changed

+44
-25
lines changed

2 files changed

+44
-25
lines changed

misc/python/materialize/mzbuild.py

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import base64
2020
import collections
2121
import hashlib
22+
import io
2223
import json
2324
import multiprocessing
2425
import os
@@ -60,8 +61,8 @@ def run_and_detect_rust_ice(
6061
"""This function is complex since it prints out each line immediately to
6162
stdout/stderr, but still records them at the same time so that we can scan
6263
for the Rust ICE."""
63-
stdout_result = ""
64-
stderr_result = ""
64+
stdout_result = io.StringIO()
65+
stderr_result = io.StringIO()
6566
p = subprocess.Popen(
6667
cmd,
6768
stdout=subprocess.PIPE,
@@ -81,44 +82,52 @@ def run_and_detect_rust_ice(
8182
running = True
8283
while running:
8384
for key, val in sel.select():
84-
output = ""
85+
output = io.StringIO()
8586
running = False
8687
while True:
8788
new_output = key.fileobj.read(1024) # type: ignore
8889
if not new_output:
8990
break
90-
output += new_output
91-
if not output:
91+
output.write(new_output)
92+
contents = output.getvalue()
93+
output.close()
94+
if not contents:
9295
continue
9396
# Keep running as long as stdout or stderr have any content
9497
running = True
9598
if key.fileobj is p.stdout:
9699
print(
97-
output,
100+
contents,
98101
end="",
99102
flush=True,
100103
)
101-
stdout_result += output
104+
stdout_result.write(contents)
102105
else:
103106
print(
104-
output,
107+
contents,
105108
end="",
106109
file=sys.stderr,
107110
flush=True,
108111
)
109-
stderr_result += output
112+
stderr_result.write(contents)
110113
p.wait()
111114
retcode = p.poll()
112115
assert retcode is not None
116+
stdout_contents = stdout_result.getvalue()
117+
stdout_result.close()
118+
stderr_contents = stderr_result.getvalue()
119+
stderr_result.close()
113120
if retcode:
114121
panic_msg = "panicked at compiler/rustc_metadata/src/rmeta/def_path_hash_map.rs"
115-
if panic_msg in stdout_result or panic_msg in stderr_result:
122+
if panic_msg in stdout_contents or panic_msg in stderr_contents:
116123
raise RustICE()
117124

118125
raise subprocess.CalledProcessError(
119-
retcode, p.args, output=stdout_result, stderr=stderr_result
126+
retcode, p.args, output=stdout_contents, stderr=stderr_contents
120127
)
121-
return subprocess.CompletedProcess(p.args, retcode, stdout_result, stderr_result)
128+
return subprocess.CompletedProcess(
129+
p.args, retcode, stdout_contents, stderr_contents
130+
)
122131

123132

124133
class Fingerprint(bytes):

misc/python/materialize/mzcompose/composition.py

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import importlib.abc
2222
import importlib.util
2323
import inspect
24+
import io
2425
import json
2526
import os
2627
import re
@@ -361,8 +362,8 @@ def invoke(
361362
]
362363

363364
for retry in range(1, max_tries + 1):
364-
stdout_result = ""
365-
stderr_result = ""
365+
stdout_result = io.StringIO()
366+
stderr_result = io.StringIO()
366367
file.seek(0)
367368
try:
368369
if capture_and_print:
@@ -391,34 +392,36 @@ def invoke(
391392
while running:
392393
running = False
393394
for key, val in sel.select():
394-
output = ""
395+
output = io.StringIO()
395396
while True:
396397
new_output = key.fileobj.read(1024) # type: ignore
397398
if not new_output:
398399
break
399-
output += new_output
400-
if not output:
400+
output.write(new_output)
401+
contents = output.getvalue()
402+
output.close()
403+
if not contents:
401404
continue
402405
# Keep running as long as stdout or stderr have any content
403406
running = True
404407
if key.fileobj is p.stdout:
405408
if print_prefix:
406-
for line in output.splitlines(keepends=True):
409+
for line in contents.splitlines(keepends=True):
407410
print(
408411
f"{print_prefix}{line}",
409412
end="",
410413
flush=True,
411414
)
412415
else:
413416
print(
414-
output,
417+
contents,
415418
end="",
416419
flush=True,
417420
)
418-
stdout_result += output
421+
stdout_result.write(contents)
419422
else:
420423
if print_prefix:
421-
for line in output.splitlines(keepends=True):
424+
for line in contents.splitlines(keepends=True):
422425
print(
423426
f"{print_prefix}{line}",
424427
end="",
@@ -427,21 +430,28 @@ def invoke(
427430
)
428431
else:
429432
print(
430-
output,
433+
contents,
431434
end="",
432435
file=sys.stderr,
433436
flush=True,
434437
)
435-
stderr_result += output
438+
stderr_result.write(contents)
436439
p.wait()
437440
retcode = p.poll()
438441
assert retcode is not None
442+
stdout_contents = stdout_result.getvalue()
443+
stdout_result.close()
444+
stderr_contents = stderr_result.getvalue()
445+
stderr_result.close()
439446
if check and retcode:
440447
raise subprocess.CalledProcessError(
441-
retcode, p.args, output=stdout_result, stderr=stderr_result
448+
retcode,
449+
p.args,
450+
output=stdout_contents,
451+
stderr=stderr_contents,
442452
)
443453
return subprocess.CompletedProcess(
444-
p.args, retcode, stdout_result, stderr_result
454+
p.args, retcode, stdout_contents, stderr_contents
445455
)
446456
else:
447457
return subprocess.run(

0 commit comments

Comments
 (0)