Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
appengine Python数据存储查询是否比Java慢很多(>;3倍)?_Java_Python_Google App Engine_Google Cloud Datastore - Fatal编程技术网

appengine Python数据存储查询是否比Java慢很多(>;3倍)?

appengine Python数据存储查询是否比Java慢很多(>;3倍)?,java,python,google-app-engine,google-cloud-datastore,Java,Python,Google App Engine,Google Cloud Datastore,我一直在调查这部电影,看能不能用它拍一张照片 在尝试在Python和Java之间进行选择时,我遇到了 数据存储查询性能的惊人差异:中等到中等 Python中的大型数据存储查询速度比 爪哇 我的问题是:这是数据存储查询的性能差异吗 (Python比Java慢3倍)正常,还是我在这方面做错了什么 我的Python代码弄乱了数字 我的实体如下所示: 人 名字(长度8) 姓氏(长度8) 地址(20) 城市(10) 国家(2) 拉链(5) 我用2000个人的记录填充数据存储,每个字段 正是此处标注的长度,

我一直在调查这部电影,看能不能用它拍一张照片 在尝试在Python和Java之间进行选择时,我遇到了 数据存储查询性能的惊人差异:中等到中等 Python中的大型数据存储查询速度比 爪哇

我的问题是:这是数据存储查询的性能差异吗 (Python比Java慢3倍)正常,还是我在这方面做错了什么 我的Python代码弄乱了数字

我的实体如下所示:

人 名字(长度8) 姓氏(长度8) 地址(20) 城市(10) 国家(2) 拉链(5)

我用2000个人的记录填充数据存储,每个字段 正是此处标注的长度,全部填充随机数据,没有 字段索引(只是为了更快地插入)

然后,我从Python中查询1k个人记录(无过滤器,无排序):

和来自Java的1k个人记录(同样,没有过滤器,没有排序):

DatastoreService ds=DatastoreServiceFactory.getDatastoreService();
查询q=新查询(“人员”);
PreparedQuery pq=ds.prepare(q);
//强制查询运行并返回对象,以便确定
//我们已为完整查询计时。
列表实体列表=新的ArrayList(pq.asList(带限制(1000));
使用此代码,Java代码将在大约200毫秒内返回结果;巨蟒 编码时间更长,平均>700ms。两个应用程序都在同一个平台上 应用程序id(具有不同版本),因此它们使用相同的数据存储,并且应该 公平竞争

我所有的代码都可以在这里找到,以防我遗漏任何细节:


这是Python和Java之间的预期差异。最有可能的情况是,您没有看到进行查询所需时间的差异,而是看到解析结果和填充接收数据结构所需的时间的差异

您可以通过比较查询单个记录所需的时间来测试这一点。请记住,您需要测试几次,并对总数进行平均,以获得一个真正的基准测试,以考虑后端延迟的可能波动


通常,您可以期望编译后的静态类型语言(如Java或Scala)总是比解释后的动态类型语言(如Ruby或Python)快。

Python和Java都编译成字节码,并在虚拟机上进行解释。Python和Ruby在这方面并不等同。没错,当将返回的协议缓冲区数据解码为SDK的datastore.py中的实体对象时,Python代码的速度似乎会减慢。小数据存储查询(10个对象)显示Java和Python之间没有明显的性能差异。@Joshua,正如adam所指出的,您在文章末尾所做的概括一般不太准确。此外,需要考虑App Engine的特定上下文,其中低流量的java应用程序必须支付启动JVM整个JVM的启动成本。“Python是一种解释语言,与编译语言不同,尽管由于字节码编译器的存在,这种区别可能很模糊。这意味着可以直接运行源文件,而无需显式创建可执行文件,然后运行该文件。“本文很好地解释了这些差异。您是否使用appstats来确定时间花在哪里?Joshua在这里很可能是正确的,因为所有运行时的数据存储后端都是相同的,但appstats会告诉您这一点。appstats报告Java的“datastore_v3.RunQuery real=122ms api=9179ms”和Python的“datastore_v3.RunQuery real=377ms api=9179ms”这样的时间。我猜这意味着两者的RPC成本是相同的,但是Python代码在操作上花费了更多的时间。Java数据存储查询的实际运行时间(平均值)为~200ms,Python为~780ms。
q = datastore.Query("Person")
objects = list(q.Get(1000))
DatastoreService ds = DatastoreServiceFactory.getDatastoreService();
Query q = new Query("Person");
PreparedQuery pq = ds.prepare(q);
// Force the query to run and return objects so we can be sure
// we've timed a full query.
List<Entity> entityList = new ArrayList<Entity>(pq.asList(withLimit(1000)));