Очевидно, что создание и (особенно) разбор JSON можно улучшить, поскольку простой пользовательский формат приводит к огромным различиям, не прибегая к нетекстовому формату.Мне пришлось изменить ваше использование putdata (в частности, формат данных, передаваемых в него), в противном случае приведенный ниже тест существенно не отличается.
$ time ./gen-json.py 1500 900 json | ./read-json.py
real 0m50.727s
user 0m50.131s
sys 0m0.164s
$ time ./gen.py 1500 900 custom | ./read.py
real 0m3.786s
user 0m6.076s
sys 0m0.064s
Простите за общее хакерство в них, как они были написаны воколо 5 минут, чтобы начать определять, в чем проблема.Тем не менее, все, кажется, работает в них хорошо;по крайней мере, я могу открыть созданные BMP.:)
gen-json.py
#!/usr/bin/env python2.6
import sys
width, height, img_id = sys.argv[1:]
width = int(width)
height = int(height)
print """{"width": %s, "height": %s, "id": "%s", "data": [""" % (width, height, img_id)
row = str([0 for _ in xrange(width)])
first = True
for _ in xrange(height):
if first:
first = False
else:
print ","
print row,
print "]}"
read-json.py
#!/usr/bin/env python2.6
import json
import sys
from PIL import Image
output = json.load(sys.stdin)
width = output['width']
height = output['height']
name = 'image-%s.bmp' % output['id']
data = []
assert len(output['data']) == height
for x in output['data']:
assert len(x) == width
data.extend(x)
img = Image.new("RGB", (width, height))
img.putdata(data)
img.save(name)
gen.py
#!/usr/bin/env python2.6
import sys
width, height, img_id = sys.argv[1:]
width = int(width)
height = int(height)
print img_id, width, height
for _ in xrange(height):
for _ in xrange(width):
print 0,
print
read.py
#!/usr/bin/env python2.6
import sys
from PIL import Image
img_id, width, height = raw_input().split()
width = int(width)
height = int(height)
name = "image-%s.bmp" % img_id
data = [int(x) for row in sys.stdin for x in row.split()]
assert len(data) == width * height
img = Image.new("RGB", (width, height))
img.putdata(data)
img.save(name)