Как передавать базовые объекты между Ruby и Python?

В настоящее время я использую JSON в качестве формата сериализации для передачи простого хэша, содержащего строки, числа и массив, из Ruby в сценарий Python:

IO.popen('./convert.py', 'w') do |w|
    w.write({ :height => height, :width => width, :id => job_id, :data => pix }.to_json)
    w.write "\n"
    w.close_write
end

В данном случае height , width и job_id - все числа, а pix - массив массивов целых чисел.

Выполняемый скрипт python:

#!/usr/bin/env python

from PIL import Image
import json
import sys

output = json.load(sys.stdin)

width = output['width']
height = output['height']
name = 'images/' + str(output['id']) + '/image.bmp'
data = [ tuple(datum) for datum in output['data'] ]

img = Image.new("RGB", (width, height))

img.putdata(data)

img.save(name)

бит быстрого тестирования с использованием массива с 3,9 миллиона значений (вероятно, около 1/4 размера, который обычно будет использоваться), показал, что сценарий занимает около 105 секунд и 90 секунд со всеми строками ниже output = ... закомментировал. Очевидно, было бы хорошо, если бы сериализация не занимала 85% времени обработки для такого простого сценария.

Единственный способ ускорить это, о котором я могу думать, - это найти некоторую форму двоичной сериализации / маршалинга, которая может использоваться для передачи данных из Ruby в Python. К сожалению, мне не удалось найти такую ​​систему, только RMarshal , который, похоже, может работать иначе.

6
задан Nemo157 22 January 2011 в 11:21
поделиться