Python 为什么从requests.post()方法中引用类字典比从直接作用域中的字典中引用要花费更长的时间?

Python 为什么从requests.post()方法中引用类字典比从直接作用域中的字典中引用要花费更长的时间?,python,dictionary,optimization,interpreter,interpreted-language,Python,Dictionary,Optimization,Interpreter,Interpreted Language,我的代码执行以下操作: 1) 定义一个有点大的字典 2) 使用请求库将带有字典的post请求发送到Web服务器 如果我将字典设置为一个类变量(类在同一个.py文件中定义),然后通过其成员函数(由main调用)引用它,则执行所需的时间要长得多(计时时大约要长半秒) 但是,如果我在类的成员函数范围内定义字典,它的执行速度会快半秒 有人能解释为什么会这样吗?我四处打听,用谷歌搜索;看起来像Python这样的解释语言不像编译语言那样执行,因为解释器完成的解析过程会降低运行时的速度 编辑:一些代码(对于第

我的代码执行以下操作:

1) 定义一个有点大的字典

2) 使用请求库将带有字典的post请求发送到Web服务器

如果我将字典设置为一个类变量(类在同一个.py文件中定义),然后通过其成员函数(由main调用)引用它,则执行所需的时间要长得多(计时时大约要长半秒)

但是,如果我在类的成员函数范围内定义字典,它的执行速度会快半秒

有人能解释为什么会这样吗?我四处打听,用谷歌搜索;看起来像Python这样的解释语言不像编译语言那样执行,因为解释器完成的解析过程会降低运行时的速度

编辑:一些代码(对于第一个方法,第二个方法只是将字典移动到myClass.theFunction()的范围内)


您的问题标题是关于通过类访问词典,但在您的问题文本中,您描述了一个更复杂的情况,涉及到发出web请求。你能在一个不涉及任何远程请求的自包含示例中重现这种减速吗?你需要提供代码;在运行时查找中有一些低效的地方,但在最热的循环之外,这种查找不需要半秒钟左右的开销。在这种情况下,有时缓存到局部变量是有用的,但我们需要看看您实际做了什么。您发布的任何内容都无法解释您描述的速度缓慢。另外,您在
\uuu init\uuuuuuu
中命名了成员
会话
,但在
函数
中引用了
用户会话
,因此我担心您错过了一些重要的东西(或者只是复制粘贴失败)。@Moo:BTW,当微基准标记时,通常的做法不是平均次数,因为这会让所有的怪事平均化。把握最好的时机;这通常更能代表“真实”成本(波动是许多你几乎无法控制的背景废话)。
timeit
模块的
repeat
功能有助于消除许多时间抖动源,并从
timeit.repeat中获取
min
结果,其中
repeat
计数为5,计数为5(或者对于网络请求,
repeat=25
number=1
可能)会给你一个更有用的基线。顺便说一句,字典不是一个“类变量”,它是一个实例变量(或属性)。你的问题标题是关于通过类访问字典,但在你的问题文本中,你描述了一个更复杂的情况,涉及到提出web请求。你能在一个不涉及任何远程请求的自包含示例中重现这种减速吗?你需要提供代码;在运行时查找中有一些低效的地方,但在最热的循环之外,这种查找不需要半秒钟左右的开销。在这种情况下,有时缓存到局部变量是有用的,但我们需要看看您实际做了什么。您发布的任何内容都无法解释您描述的速度缓慢。另外,您在
\uuu init\uuuuuuu
中命名了成员
会话
,但在
函数
中引用了
用户会话
,因此我担心您错过了一些重要的东西(或者只是复制粘贴失败)。@Moo:BTW,当微基准标记时,通常的做法不是平均次数,因为这会让所有的怪事平均化。把握最好的时机;这通常更能代表“真实”成本(波动是许多你几乎无法控制的背景废话)。
timeit
模块的
repeat
功能有助于消除许多时间抖动源,并从
timeit.repeat中获取
min
结果,其中
repeat
计数为5,计数为5(或者对于网络请求,
repeat=25
number=1
可能)顺便说一句,字典不是一个“类变量”,它是一个实例变量(或属性)。
import requests

class myClass():
    def __init__(self):
        ...Other member variables...
        self.user_session = requests.Session()
        self.myDict = { 'key1': 'value1',
                    ....
                    'key30': 'value30'
                  }
    def theFunction(self):
        ....some parsing stuff...
        session_post = self.user_session.post(url=self.URL, data=self.myDict,
                                              headers=self.headers)
        print session_post.status_code

if __name__ == '__main__':
    instance = myClass()
    instance.theFunction()