【问题标题】:Python on android (kivy) - speed bottlenecks for certain operations?android(kivy)上的 Python - 某些操作的速度瓶颈?
【发布时间】:2016-03-04 19:38:11
【问题描述】:

我在开发 Kivy 应用程序方面已经走了很长一段路。它针对 android,但也可以在台式机上运行(同时使用不同的皮肤),希望最终能在 iO 上运行。

我大量使用的基本依赖项是:-

  • twisted - 使用它作为 IPC,我的应用程序有一个服务器/客户端 数据操作和 UI 之间的关系

  • Whoosh - 用于文本搜索

  • xmltodict - 便于 XML 操作

我在 Android 上的应用启动时间真的很长,在一部相对较新的手机上,这不是好兆头。根据我的粗略时间(基于 time.time() 并从我的应用的 init 时间中减去):-

  • 我的应用在大约 1 秒后从 kivy 启动获得控制权

  • 我的自定义类等的初始化在 2.4 秒标记完成

  • 在 14.4 秒时,我终于完成了大部分数据加载

  • 在 17 秒时,我开始使用 twisted 将数据发送到客户端 UI

  • 在 22 秒标记处,UI 接收数据

我想在这里解决多个问题。例如,大约 5 秒的数据发送间隔可以很容易地分解并在 UI 中零碎更新,所以我将其保留到以后,但我需要询问关于数据加载的 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 倍。

如果有的话,我能做些什么呢?用于测试的手机有 3GB 的 RAM 和 Snapdragon 801 处理器,所以我很担心在较慢/较旧的型号上使用这个应用程序。我最初的想法是速度变慢是由于 sd 卡本质上比我笔记本电脑的硬盘驱动器慢,但是 xml 解析(与 IO 无关)花了这么长时间似乎表明处理问题。

欢迎提出建议/批评。

【问题讨论】:

  • 你能用比xml更方便的方式存储数据吗? pickle 甚至 json 怎么样?
  • 我已经考虑过了,但是由于遗留原因,我的基础数据源需要是 xml。我目前正在考虑在启动时使用一个缓存(可能是腌制),一旦数据读取线程发现差异,它就会更新。但这只是在以后推动问题......
  • 看看能不能得到lxml库,编译好了,应该会快很多。我肯定会把所有我能做的东西都缓存起来,即使这只会减少一秒钟的启动时间。
  • 我已经在 lxml 中快速实现了瓶颈 XML 代码(读取),它将运行时间缩短了一半。尽管如此,它仍然可能太慢了一个数量级,让我有 10 多秒的启动时间,这并不能解决整个“为什么它在 Android 上这么慢”的问题。
  • 我打算建议优化不佳的 python 解释器/xml 模块,但由于 LXML 本身运行并且也很慢,所以它是 python 之外的东西。也许将文件从 SD 卡移动到板载存储。

标签: android python optimization kivy


【解决方案1】:

直接的可能性是您只是看到 android 处理器比桌面处理器慢。我不确定现在的基准比较是什么,但我过去已经看到这是一个问题。话虽如此,我和你的猜测一样,差异应该不会那么大。

我不知道这是否会有所不同,但可以尝试的一般方法是编译 armeabi-v7a(而不是默认的 armeabi)。这使得硬件浮点计算等成为可能。我不知道它是否会对通用应用程序产生影响,但它肯定可以。您可以使用带有--arch=armeabi-v7a 的python-for-android master 分支或buildozer master 分支中的android_new 目标(其余的buildozer 操作相同,它会自动使用v7a)来定位它。

另一个问题是,您是否可以使用更高效的 xml 解析器?如果你能在例如找到一个cython 而不是 python (我不知道你现在在使用什么),这可能会有所作为。我看到评论中已经提出了使用更有效数据结构的另一种选择。

很抱歉,这些建议都不是很具体。如果您在 kivy 支持渠道上提问,您可能会找到发现并解决了类似问题的人。

【讨论】:

  • 谢谢,我会试试编译选项。我的问题指定我正在使用 xmltodict,并且更改它将是一项相当复杂的任务。由于工作量大,不得已而为之。
  • 我已经使用 lxml 破解了(应该尽可能快),我有大约 5 秒的时间来读取、解析和创建我的对象。哪个更好,但仍然比笔记本电脑慢 10 倍以上(速度提升相似)。
  • 编译选项给出的结果可以忽略不计,据我通过简单的基准测试可以看出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-17
  • 2013-10-21
  • 2021-12-06
  • 2018-07-20
相关资源
最近更新 更多