如何在 Google cloud-ndb 库中加速或优化上下文管理?
How can I speed up or perftest context management in Google cloud-ndb library?
我正在将应用程序 运行ning 迁移到 Google App Engine Python 2.7 标准环境中,从内置 NDB 到库到较新的云-ndb 库(在迁移到 Python 3 之前)。新库需要所有 NDB 调用的上下文,经过一些研究并与 appengine 电子邮件列表中的其他人交谈后,我 运行 使用在单元测试 setUp()
和 tearDown()
中输入上下文的方法。我所有的测试文件都来自 shim 基础测试 class.
#speed_test.py
from test._base_test import MyTestCase
class SpeedTest(MyTestCase):
def test_simple(self):
string = 'string'
self.assertEqual('string', string)
#_base_test.py
import requests
import unittest
import webapp2
from google.cloud import ndb
class MyTestCase(unittest.TestCase):
def setUp(self):
self.testapp = webapp2.WSGIApplication([])
# clear datastore
requests.post('http://localhost:8089/reset')
self.ndb_context = ndb.Client().context()
self.ndb_context.__enter__()
def tearDown(self):
self.ndb_context.__exit__(None, None, None)
mock.patch.stopall()
问题是,以这种方式输入上下文会使我的每个测试增加不到 2 秒的时间。这对我的测试文件有十几个或更少的测试有点刺激,但我们的完整测试套件有 681 个测试,这个速度是不可行的。
上面的简单速度测试应该需要几分之一秒才能完成,但它始终 运行s 在 1.7s 或更长时间内完成。如果我注释掉 self.ndb_context = ndb.Client().context()
和 self.ndb_context.__enter__()
,它会下降到大约 0.003s。
感觉上下文管理器 运行 花了很长时间,但我不确定此时如何进一步调试性能。我很乐意就更好的方法或手段提出建议来调试这里发生的事情,这样我就可以在需要时向库提交问题。谢谢!
也许您应该只输入一次上下文而不是每次测试。再试一次,但使用方法 setUpClass
和 tearDownClass
而不是 setUp
和 tearDown
进入上下文。您将在 unittest's documentation.
上找到这些方法
问题原来是在 setUp()/tearDown() 方法中重复创建 NDB 客户端对象。一旦我将客户端移动到 class 之外的变量,它就会恢复到预期的性能水平。
#_base_test.py
import requests
import unittest
import webapp2
from google.cloud import ndb
NDB_CLIENT = ndb.Client()
class MyTestCase(unittest.TestCase):
def setUp(self):
self.testapp = webapp2.WSGIApplication([])
# clear datastore
requests.post('http://localhost:8089/reset')
self.ndb_context = NDB_CLIENT.context()
self.ndb_context.__enter__()
def tearDown(self):
self.ndb_context.__exit__(None, None, None)
mock.patch.stopall()
我正在将应用程序 运行ning 迁移到 Google App Engine Python 2.7 标准环境中,从内置 NDB 到库到较新的云-ndb 库(在迁移到 Python 3 之前)。新库需要所有 NDB 调用的上下文,经过一些研究并与 appengine 电子邮件列表中的其他人交谈后,我 运行 使用在单元测试 setUp()
和 tearDown()
中输入上下文的方法。我所有的测试文件都来自 shim 基础测试 class.
#speed_test.py
from test._base_test import MyTestCase
class SpeedTest(MyTestCase):
def test_simple(self):
string = 'string'
self.assertEqual('string', string)
#_base_test.py
import requests
import unittest
import webapp2
from google.cloud import ndb
class MyTestCase(unittest.TestCase):
def setUp(self):
self.testapp = webapp2.WSGIApplication([])
# clear datastore
requests.post('http://localhost:8089/reset')
self.ndb_context = ndb.Client().context()
self.ndb_context.__enter__()
def tearDown(self):
self.ndb_context.__exit__(None, None, None)
mock.patch.stopall()
问题是,以这种方式输入上下文会使我的每个测试增加不到 2 秒的时间。这对我的测试文件有十几个或更少的测试有点刺激,但我们的完整测试套件有 681 个测试,这个速度是不可行的。
上面的简单速度测试应该需要几分之一秒才能完成,但它始终 运行s 在 1.7s 或更长时间内完成。如果我注释掉 self.ndb_context = ndb.Client().context()
和 self.ndb_context.__enter__()
,它会下降到大约 0.003s。
感觉上下文管理器 运行 花了很长时间,但我不确定此时如何进一步调试性能。我很乐意就更好的方法或手段提出建议来调试这里发生的事情,这样我就可以在需要时向库提交问题。谢谢!
也许您应该只输入一次上下文而不是每次测试。再试一次,但使用方法 setUpClass
和 tearDownClass
而不是 setUp
和 tearDown
进入上下文。您将在 unittest's documentation.
问题原来是在 setUp()/tearDown() 方法中重复创建 NDB 客户端对象。一旦我将客户端移动到 class 之外的变量,它就会恢复到预期的性能水平。
#_base_test.py
import requests
import unittest
import webapp2
from google.cloud import ndb
NDB_CLIENT = ndb.Client()
class MyTestCase(unittest.TestCase):
def setUp(self):
self.testapp = webapp2.WSGIApplication([])
# clear datastore
requests.post('http://localhost:8089/reset')
self.ndb_context = NDB_CLIENT.context()
self.ndb_context.__enter__()
def tearDown(self):
self.ndb_context.__exit__(None, None, None)
mock.patch.stopall()