0

I wrote some code to binary reverse data in python. See below:

#!/usr/bin/python
import sys

data = sys.stdin.read()
for i in reversed(data):
    sys.stdout.write(chr(int('{:08b}'.format(ord(i))[::-1], 2)))

The program works fine!

$ echo -e 'hallo\c' | xxd -b 
00000000: 01101000 01100001 01101100 01101100 01101111           hallo

$ echo -e 'hallo\c' | ./stdi.py  | xxd -b 
00000000: 11110110 00110110 00110110 10000110 00010110           .66..

But the performance is poor.

$ time dd if=/dev/urandom count=1 bs=1M  | ./stdi.py > nix
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.0209197 s, 50.1 MB/s

real    0m2.032s
user    0m2.015s
sys     0m0.025s

May someone can give me a hint or a better performing solution!

Edit: My fastest solution is about 10 times as fast as the initial solution:

#!/usr/bin/python
import array
import sys

rtrans = [0, 128, 64, 192, 32, 160, 96, 224, 16, 144, 80, 208, 48, 176, 112, 240, 8, 136, 72, 200, 40, 168, 104, 232, 24, 152, 88, 216, 56, 184, 120, 248, 4, 132, 68, 196, 36, 164, 100, 228, 20, 148, 84, 212, 52, 180, 116, 244, 12, 140, 76, 204, 44, 172, 108, 236, 28, 156, 92, 220, 60, 188, 124, 252, 2, 130, 66, 194, 34, 162, 98, 226, 18, 146, 82, 210, 50, 178, 114, 242, 10, 138, 74, 202, 42, 170, 106, 234, 26, 154, 90, 218, 58, 186, 122, 250, 6, 134, 70, 198, 38, 166, 102, 230, 22, 150, 86, 214, 54, 182, 118, 246, 14, 142, 78, 206, 46, 174, 110, 238, 30, 158, 94, 222, 62, 190, 126, 254, 1, 129, 65, 193, 33, 161, 97, 225, 17, 145, 81, 209, 49, 177, 113, 241, 9, 137, 73, 201, 41, 169, 105, 233, 25, 153, 89, 217, 57, 185, 121, 249, 5, 133, 69, 197, 37, 165, 101, 229, 21, 149, 85, 213, 53, 181, 117, 245, 13, 141, 77, 205, 45, 173, 109, 237, 29, 157, 93, 221, 61, 189, 125, 253, 3, 131, 67, 195, 35, 163, 99, 227, 19, 147, 83, 211, 51, 179, 115, 243, 11, 139, 75, 203, 43, 171, 107, 235, 27, 155, 91, 219, 59, 187, 123, 251, 7, 135, 71, 199, 39, 167, 103, 231, 23, 151, 87, 215, 55, 183, 119, 247, 15, 143, 79, 207, 47, 175, 111, 239, 31, 159, 95, 223, 63, 191, 127, 255]                                                                                      

sys.stdout.write(array.array('B', map(lambda x: rtrans[x], array.array('B', sys.stdin.read()[::-1]))).tostring())


time dd if=/dev/urandom count=1 bs=1M  | ./fastest.py > nix
1+0 records in
1+0 records out
1048576 bytes (1.0 MB, 1.0 MiB) copied, 0.0148036 s, 70.8 MB/s

real    0m0.185s
user    0m0.171s
sys     0m0.027s
1

1 Answer 1

1

Using a single write()?

chars = [chr(int('{:08b}'.format(ord(i))[::-1], 2)) for i in reversed(data)]
sys.stdout.write(''.join(chars))

Here's what I'm getting on my machine.

Before:

1+0 records in 1+0 records out 1048576 bytes (1.0 MB, 1.0 MiB) copied, 0.0961667 s, 10.9 MB/s real 0m1.233s user 0m1.144s sys 0m0.100s

After:

1+0 records in 1+0 records out 1048576 bytes (1.0 MB, 1.0 MiB) copied, 0.0931753 s, 11.3 MB/s real 0m0.961s user 0m0.860s sys 0m0.104s

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.