如果我在C++应用程序中全局声明数据结构,它是否会消耗堆栈内存或堆内存?
例如
struct AAA
{
.../.../.
../../..
}arr[59652323];
Run Code Online (Sandbox Code Playgroud) 这是一个简单程序的概述
# some pre-defined constants
A = 1
B = 2
# function that does something critical
def foo(num1, num2):
# do something
# main program.... do something to A and B
for i in range(20):
# do something to A and B
# and update A and B during each iteration
import timeit
t = timeit.Timer(stmt="foo(num1,num2)")
print t.timeit(5)
Run Code Online (Sandbox Code Playgroud)
我只是不断得到"全球名称foo没有定义".....任何人都可以帮助我吗?谢谢!
我还是Python新手,我一直在努力提高Python脚本的性能,所以我测试了它是否有全局变量.我把它计时了,令我惊讶的是,它在声明全局变量时运行得更快,而不是将局部变量传递给函数.这是怎么回事?我认为局部变量的执行速度更快?(我知道全局变量不安全,我仍然很好奇.)
我正在用Python编写一个应用程序,它将具有许多不同的功能,所以逻辑上我认为最好将我的脚本分成不同的模块.目前我的脚本读入一个文本文件,其中包含已转换为标记和拼写的代码.然后,该脚本将代码重建为一个字符串,其中的空行将在原始代码中显示注释.
我遇到了使脚本面向对象的问题.无论我尝试什么,我似乎无法让程序以与它只是一个脚本文件相同的方式运行.理想情况下,我想要有两个脚本文件,一个包含清理和重建文件的类和函数.第二个脚本只是从命令行中作为参数给出的文件中的另一个文件中的类调用该函数.这是我目前的脚本:
import sys
tokenList = open(sys.argv[1], 'r')
cleanedInput = ''
prevLine = 0
for line in tokenList:
if line.startswith('LINE:'):
lineNo = int(line.split(':', 1)[1].strip())
diff = lineNo - prevLine - 1
if diff == 0:
cleanedInput += '\n'
if diff == 1:
cleanedInput += '\n\n'
else:
cleanedInput += '\n' * diff
prevLine = lineNo
continue
cleanedLine = line.split(':', 1)[1].strip()
cleanedInput += cleanedLine + ' '
print cleanedInput
Run Code Online (Sandbox Code Playgroud)
按照下面的Alex Martelli建议后,我现在有以下代码,它给出了与原始代码相同的输出.
def main():
tokenList = open(sys.argv[1], 'r')
cleanedInput = []
prevLine = …Run Code Online (Sandbox Code Playgroud) 请看下面的代码来解决同一组问题,我不认为提到问题无论如何会帮助目的,这是Josephus问题的又一次迭代:
解决方案1:
import sys
from math import log
cases= int(sys.stdin.readline())
current= 0
while current < cases:
current += 1
n = int(sys.stdin.readline())
print 2*(n - 2**(int(log(n,2))))+1
Run Code Online (Sandbox Code Playgroud)
该解决方案在累计1.0912秒内解决了给定的10个测试用例,并消耗了4360KiB的内存.
解决方案2:
def josephus_2( n ):
from math import log
return 2*(n - 2**(int(log(n,2))))+1
import sys
cases= int(sys.stdin.readline())
current= 0
while current < cases:
current += 1
n = int(sys.stdin.readline())
print josephus_2( n )
Run Code Online (Sandbox Code Playgroud)
该解决方案在总共1.0497秒和640KiB内存中解决了相同的10个测试用例.
作为一个Python n00b,我想知道,虽然根据在线评判,我获得两个相同的积分,但是什么使解决方案2比1更快,更高的内存效率?我知道时间差可以听起来很少,但同时我在最快的解决方案上排名第一,甚至比c/c ++/perl提交更快
from math import sqrt
def factors(x):
num = 2
sq = int(sqrt(x))
for i in range(2, sq):
if (x % i) == 0:
num += 2
return num + ((1 if sq == sqrt(x) else 2) if x % sq == 0 else 0)
Run Code Online (Sandbox Code Playgroud)
i = 1
while True:
if factors(i * (i+1) * 0.5) > 500:
print(int(i * (i+1) * 0.5))
break
i += 1
Run Code Online (Sandbox Code Playgroud)
def triangle():
i = 1
while True:
yield int(0.5 * i …Run Code Online (Sandbox Code Playgroud) 我一直在努力理解Python的循环性能,在这里我发现,对于在全局空间中具有相同迭代的循环,与函数内部的迭代相比需要花费很多时间.
import time
MAX_NUM = 50000000
# Running for loop in global space
start = time.time()
for i in xrange(MAX_NUM):
pass
print time.time() - start
# Running th same kind of loop within a function
def foo():
for i in xrange(MAX_NUM):
pass
start = time.time()
foo()
print time.time() - start
Run Code Online (Sandbox Code Playgroud)
当我执行此操作时,我目睹了执行时间的巨大差异.
2.00527501106
0.811304092407
Run Code Online (Sandbox Code Playgroud)
我想知道是什么让执行时间产生巨大差异?循环性能如何影响全局空间写入函数内部?
为什么在函数中执行一组命令:
def main():
[do stuff]
return something
print(main())
Run Code Online (Sandbox Code Playgroud)
在python中运行速度比在顶层执行命令1.5x要3x快得多:
[do stuff]
print(something)
Run Code Online (Sandbox Code Playgroud) 我看到一条评论引导我提出问题为什么Python代码在函数中运行得更快?.
我开始思考,并想我会自己尝试使用该timeit库,但是我得到了非常不同的结果:
(注意:10**8改为10**7让时间更快一些)
>>> from timeit import repeat
>>> setup = """
def main():
for i in xrange(10**7):
pass
"""
>>> stmt = """
for i in xrange(10**7):
pass
"""
>>> min(repeat('main()', setup, repeat=7, number=10))
1.4399558753975725
>>> min(repeat(stmt, repeat=7, number=10))
1.4410973942722194
>>> 1.4410973942722194 / 1.4399558753975725
1.000792745732109
Run Code Online (Sandbox Code Playgroud)
timeit得当吗?我有一个数据框,其中有一列包含整数,我想将其与一列包含字符串值的组合。两列都是对象数据类型。问题是这些列也可能是 NaN。
我找到的解决方案会导致不同的错误或不良结果。
我的数据框如下所示:
| 指数 | 剂量持续时间单位 | 剂量数量值 | 剂量单位 | 数量值 |
|---|---|---|---|---|
| 0 | 天 | 南 | 南 | 南 |
| 1 | 天 | 南 | 片剂 | 南 |
| 2 | 天 | 2 | 南 | 南 |
| 3 | 天 | 1 | 片剂 | 南 |
| 4 | 天 | 2 | 片剂 | 南 |
创建数据框的代码:
df = pd.DataFrame([["day",None,None,None],["day",None,"tablet(s)",None],["day",2,"tablet(s)",None],["day",1,"tablet(s)",None],["day",2,"tablet(s)",None]], columns=["dosagedurationunit","dosagequantityvalue","dosagequantityunit","quantityvalue"])
Run Code Online (Sandbox Code Playgroud)
以下答案适用于相同类型(str)的列: Combine pandas string columns with Missing Values
df['DOSE'] = df[['dosagequantityvalue', 'dosagequantityunit']].apply(
lambda x: None if x.isnull().all() else ' '.join(x.dropna()), axis=1)
Run Code Online (Sandbox Code Playgroud)
所需的输出数据帧:
| 指数 | 剂量持续时间单位 | 剂量数量值 | 剂量单位 | 数量值 | 标准化剂量 |
|---|---|---|---|---|---|
| 0 | 天 | 南 … |
python ×9
performance ×4
python-2.7 ×3
python-3.x ×2
benchmarking ×1
c++ ×1
cpython ×1
dataframe ×1
generator ×1
josephus ×1
nan ×1
oop ×1
optimization ×1
pandas ×1
profiling ×1
stack ×1
time ×1
timer ×1