def main():
for i in xrange(10**8):
pass
main()
Run Code Online (Sandbox Code Playgroud)
Python中的这段代码运行(注意:时序是在Linux中的BASH中使用时间函数完成的.)
real 0m1.841s
user 0m1.828s
sys 0m0.012s
Run Code Online (Sandbox Code Playgroud)
但是,如果for循环没有放在函数中,
for i in xrange(10**8):
pass
Run Code Online (Sandbox Code Playgroud)
然后它会运行更长的时间:
real 0m4.543s
user 0m4.524s
sys 0m0.012s
Run Code Online (Sandbox Code Playgroud)
为什么是这样?
我对python很新,我想知道局部变量是如何工作的.让我们从一个简单方法的例子开始:
def do_sth():
local_dict = { 'a': 1, 'b': 2, 'c': 3, ... }
...
Run Code Online (Sandbox Code Playgroud)
我们假设local_dict像一个const变量一样使用.这就是问题:每次调用do_sth()或创建一次并将其保存在do_sth()内部的某个地方时,都会创建它?
函数调用总会产生一些开销.但为什么下面的代码显示非函数调用较慢.
import time
def s():
for i in range(1000000000):
1 + 1
t = time.time()
s()
print("Function call: " + str(time.time() - t))
t = time.time()
for i in range(1000000000):
1 + 1
print("Non function call: " + str(time.time() - t))
Run Code Online (Sandbox Code Playgroud)
Function call: 38.39736223220825
Non function call: 60.33238506317139
Run Code Online (Sandbox Code Playgroud) 不幸的是,这段代码的运行速度比“os.walk”慢,但为什么呢?
难道是“for”循环导致运行缓慢?
“像‘os.walk’一样工作的代码:( ‘os.walk’函数做了它所做的事情)
注: 我写这篇文章是为了提高自己!:
import os, time
from os.path import *
x = ""
y = []
z = []
var = 0
def walk(xew):
global top, var, x,y,z
if not var: var = [xew]
for i in var:
try:
for ii in os.listdir(i):
y.append(ii) if isdir(i+os.sep+ii) else z.append(ii)
x = top = i
var = [top+os.sep+i for i in os.listdir(top) if isdir(top+os.sep+i)]
except:
continue
yield x,y,z
yield from walk(var)
var.clear();y.clear();z.clear()
Run Code Online (Sandbox Code Playgroud)
例如:
2秒后结束:
for x,y,z in …Run Code Online (Sandbox Code Playgroud) 我正在创建一个"实时"流程,该流程从SierraChart更新的专有格式化OHLCVTBA文件中获取数据.使用生成器读取数据并创建数据帧的代码发布在pastebin上
我意识到我的结构(新数据驱动)是错误的,我即将重新组织它. PhE的问题和Wes的回应让我朝着填充预先填充的数据框架的方向发挥了作用.我的问题是:
将我的数据帧和指针保存为全局变量或将它们传递给使用它们的各种函数是否更快?此外,还有其他考虑应该推动这一选择吗?
谢谢.
我在代码库和在线中也看到了很多这种风格,如果你有一个带有for循环的函数和if语句,那么只有它们使用的所有变量都没有在它们之外声明.例如:
void process()
{
int i;
int count = 100;
vector3 point;
vector sum;
for (i = 0; i < count; ++i)
{
import(this, "pos", point);
sum += point;
}
sum /= count;
}
Run Code Online (Sandbox Code Playgroud)
或者这是不成熟的优化?我对C++,C#和Python很感兴趣,这些是我使用的语言,我一遍又一遍地看到它们.
python ×6
performance ×3
python-3.x ×2
benchmarking ×1
c# ×1
c++ ×1
cpython ×1
function ×1
optimization ×1
pandas ×1
profiling ×1
python-3.6 ×1