2016-03-04 3 views
1

Я довольно далеко развил приложение Kivy. Он предназначен для Android, но также будет работать (одновременно с другой кожей) на настольных компьютерах и, надеюсь, в будущем.Python on android (kivy) - узкие места для определенных операций?

Основные зависимости я сильно использую являются: -

  • витую - используя это как IPC, мое приложение имеет сервер/клиент связь между манипулированием данными и пользовательский интерфейс

  • Свист - для поиска текста

  • xmltodict - для легкого манипулирования XML

У меня ДЕЙСТВИТЕЛЬНО длительное время запуска приложений на Android, на сравнительно недавнем телефоне, который не сулит ничего хорошего. Из моих грубых таймингов (на основе time.time() и вычитая из моего инициализации времени приложения): -

  • Мое приложение получает управление от kivy запуска около 1 секунды в

  • Моего инициализации пользовательских классов и т.д. делается на 2,4 второго знака

  • на второй отметке 14.4, я, наконец, завершить большую часть моей загрузки данных

  • на 17 сек econd знак, я начинаю посылать данные к клиентскому UI с помощью витой

  • На второй отметке 22, интерфейс получает данные

Там в несколько точек, которые я хочу обратиться туда. Например, примерно 5-секундный промежуток для отправки данных может быть легко разбит на части и обновлен в пользовательском интерфейсе по частям, поэтому я сохраню это позже, но мне нужно спросить о длинном 12-секундном промежутке для загрузки данных. Эта загрузка данных включает в себя создание около 1000 экземпляров пользовательского класса, со следующими шагами (общее время более 1000 экземпляров): -

  • Чтение данных из файлов 1000 текстовых XML (0,734 секунд)

  • Разбор XML в считанных данных (9.198 секунд)

  • Заполнение переменных объекта на основе проанализированной XML (0,585 секунд)

  • дерева каталогов обхода (использовать это, чтобы найти определенная базовая папка, 0.0824 секунд)

  • измерение времени изменения для XML-файлов (0.12 секунд)

Измеренных тайминги меня удивили, потому что эквивалентные тайминги для запуска той же коды на моем ноутбуке являются 0,041 , 0,9, 0,062, 0,009 и 0,016). Все примерно в 10 раз медленнее.

Что, если что-нибудь, я могу сделать по этому поводу? Телефон, используемый для тестирования, имеет 3 ГБ оперативной памяти и процессор Snapdragon 801, поэтому я очень беспокоюсь об использовании этого приложения на более медленных/старых моделях. Мои первоначальные мысли заключались в том, что замедление произошло из-за того, что sd-карты были по сути медленнее, чем мой жесткий диск на ноутбуке, но тот факт, что разбор XML-файлов (не связанный с IO) длился так долго, кажется, указывает на проблемы с обработкой.

Предложения/критика приветствуются.

+0

Можете ли вы сохранить данные в чем-то более удобном, чем xml? Как насчет рассола или даже json? – Muposat

+0

Я подумал об этом, но мой базовый источник данных должен быть xml по старым причинам. В настоящее время я размышляю над кешем (вероятно, маринованным), который будет использоваться при запуске, который обновляется после того, как поток чтения данных найдет разницу. Это только толкает проблему позже, хотя ... –

+0

Посмотрите, можете ли вы получить библиотеку lxml, она скомпилирована и должна быть намного быстрее. Я определенно буду кэшировать все, что смогу, как рассол, даже если это сократит время запуска всего на секунду. – Muposat

ответ

1

Непосредственная возможность заключается в том, что вы просто видите, что процессор Android работает медленнее, чем рабочий стол. Я не уверен, что сейчас сравнительные сравнения, но я видел, что это было проблемой в прошлом. Тем не менее, я бы догадался, что разница не должна быть такой большой.

Я не знаю, будет ли это иметь значение, но одна общая вещь, которую можно попробовать, может заключаться в компиляции для armeabi-v7a (а не по умолчанию armeabi). Это позволяет, помимо прочего, вычислять с плавающей точкой оборудование. Я не знаю, влияет ли это на общие приложения, но это, безусловно, может. Вы можете настроить таргетинг с помощью основной ветви python-for-android с помощью --arch=armeabi-v7a или цели android_new в основной ветке buildozer (остальная операция buildozer такая же, и она автоматически использует v7a).

Другой вопрос: есть ли у вас доступ к более эффективному синтаксическому анализатору xml? Если вы можете найти его, например, cython, а не python (я не знаю, что вы сейчас используете), это может иметь значение. Я вижу, что другая альтернатива использования более эффективной структуры данных уже была поднята в комментарии.

Извините, что ни одно из этих предложений не является конкретным. Если вы спросите о каналах поддержки киви, вы можете найти кого-то, кто нашел и разрешил подобные проблемы.

+0

Спасибо, я попробую варианты компиляции. Мой вопрос указывает, что я использую xmltodict, и изменение этого будет довольно сложной задачей. В последнюю очередь из-за объема работы. –

+0

Я взломал с помощью lxml (должен быть как можно быстрее), и я получаю примерно 5 секунд для чтения, разбора и создания моих объектов. Который лучше, но все же в 10+ раз медленнее, чем на ноутбуке (который получил аналогичную прирост скорости). –

+0

Параметры компиляции дают ничтожный результат, насколько я могу судить по простым эталонам. –

Смежные вопросы