Created
March 4, 2015 00:33
-
-
Save pkoch/05e854fb805c21b0b2c2 to your computer and use it in GitHub Desktop.
Buffer vs. Array join
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import resource | |
def max_rss(): | |
return resource.getrusage( | |
resource.RUSAGE_SELF, | |
).ru_maxrss | |
prev_result = None | |
def mem_delta(prefix=None): | |
global prev_result | |
if prefix is not None: | |
prefix += ': ' | |
else: | |
prefix = '' | |
new_result = max_rss() | |
message = prefix + str(new_result - prev_result) | |
prev_result = new_result | |
return message | |
def generate_string(): | |
return 'a' * 1024 | |
assert generate_string() is not generate_string(), \ | |
"generate_string must generate non-interned strings for this to be a " \ | |
"decent benchmark." | |
buffer_ = [] | |
# Before all the munging. Baseline. | |
prev_result = max_rss() | |
for i in xrange(1024 ** 2): | |
buffer_.append(generate_string()) | |
print mem_delta('After filling the buffer') | |
result = b''.join(buffer_) | |
print mem_delta('After getting value') | |
del buffer_ | |
print mem_delta('After releasing the buffer') |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import resource | |
from io import BytesIO | |
def max_rss(): | |
return resource.getrusage( | |
resource.RUSAGE_SELF, | |
).ru_maxrss | |
prev_result = None | |
def mem_delta(prefix=None): | |
global prev_result | |
if prefix is not None: | |
prefix += ': ' | |
else: | |
prefix = '' | |
new_result = max_rss() | |
message = prefix + str(new_result - prev_result) | |
prev_result = new_result | |
return message | |
def generate_string(): | |
return 'a' * 1024 | |
assert generate_string() is not generate_string(), \ | |
"generate_string must generate non-interned strings for this to be a " \ | |
"decent benchmark." | |
buffer_ = BytesIO() | |
# Before all the munging. Baseline. | |
prev_result = max_rss() | |
for i in xrange(1024 ** 2): | |
buffer_.write(generate_string()) | |
print mem_delta('After filling the buffer') | |
result = buffer_.getvalue() | |
print mem_delta('After getting value') | |
del buffer_ | |
print mem_delta('After releasing the buffer') |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# For array.py | |
# 0 | |
After filling the buffer: 1105908 | |
After getting value: 1048480 | |
After releasing the buffer: 216 | |
# 1 | |
After filling the buffer: 1105908 | |
After getting value: 1048612 | |
After releasing the buffer: 84 | |
# 2 | |
After filling the buffer: 1105908 | |
After getting value: 1048444 | |
After releasing the buffer: 252 | |
# 3 | |
After filling the buffer: 1105908 | |
After getting value: 1048444 | |
After releasing the buffer: 252 | |
# For buffer.py | |
# 0 | |
After filling the buffer: 1048812 | |
After getting value: 1048492 | |
After releasing the buffer: 124 | |
# 1 | |
After filling the buffer: 1049516 | |
After getting value: 1048584 | |
After releasing the buffer: 0 | |
# 2 | |
After filling the buffer: 1049604 | |
After getting value: 1048588 | |
After releasing the buffer: 0 | |
# 3 | |
After filling the buffer: 1050328 | |
After getting value: 1048488 | |
After releasing the buffer: 0 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
pypy results are worse...: