如何在Python中创建两个装饰器来执行以下操作?
@makebold
@makeitalic
def say():
return "Hello"
Run Code Online (Sandbox Code Playgroud)
...应该返回:
"<b><i>Hello</i></b>"
Run Code Online (Sandbox Code Playgroud)
我不是试图HTML在一个真实的应用程序中这样做 - 只是试图了解装饰器和装饰器链是如何工作的.
哪个更适合用于Python中的计时?time.clock()或time.time()?哪一个提供更准确?
例如:
start = time.clock()
... do something
elapsed = (time.clock() - start)
Run Code Online (Sandbox Code Playgroud)
与
start = time.time()
... do something
elapsed = (time.time() - start)
Run Code Online (Sandbox Code Playgroud) [编辑:有人指出我使用了不正确的palindrom概念,现在我已经编辑了正确的功能.我在第一个和第三个例子中也做了一些优化,其中for语句一直到它达到字符串的一半]
我已经为一个检查字符串是否为回文的方法编写了三个不同的版本.该方法实现为类"str"的扩展
该方法还将字符串转换为小写,并删除所有准时和空格.哪一个更好(更快,pythonic)?
以下是方法:
1)这是我想到的第一个解决方案:
def palindrom(self):
lowerself = re.sub("[ ,.;:?!]", "", self.lower())
n = len(lowerself)
for i in range(n//2):
if lowerself[i] != lowerself[n-(i+1)]:
return False
return True
Run Code Online (Sandbox Code Playgroud)
我认为这个更快,因为没有字符串的转换或反转,并且for语句在第一个不同的元素处断开,但我不认为这是一种优雅和pythonic的方式
2)在第二个版本中,我使用在stackoverflow上创建的解决方案进行转换(使用高级切片字符串[:: - 1])
# more compact
def pythonicPalindrom(self):
lowerself = re.sub("[ ,.;:?!]", "", self.lower())
lowerReversed = lowerself[::-1]
if lowerself == lowerReversed:
return True
else:
return False
Run Code Online (Sandbox Code Playgroud)
但我认为切片和字符串之间的比较使这个解决方案变慢.
3)我想到的第三个解决方案,使用迭代器:
# with iterator
def iteratorPalindrom(self):
lowerself = re.sub("[ ,.;:?!]", "", self.lower())
iteratorReverse = reversed(lowerself)
for char in lowerself[0:len(lowerself)//2]:
if next(iteratorReverse) != char:
return …Run Code Online (Sandbox Code Playgroud) 似乎在Spyder(IPython3 Kernel)中,可以通过在代码单元顶部运行%%timeor %%timeit命令来轻松计时代码单元:
#%%
%%time # or %%timeit which measures average runtime from multiple runs
....
#%% (the previous cell ends and the next begins)
Run Code Online (Sandbox Code Playgroud)
运行上面的代码可以获得由这对代码定义的单元格的运行时间#%%.这就是Spyder中的工作方式,但在Jupyter Notebook环境中并不常用.
在Jupyter中,代码单元格不是由#%%分隔符定义的,而是通过单击菜单栏中的按钮来创建.而据我试过了,命令%%time和%%timeit既能提高编译错误.似乎Jupyter无法识别它们,但它很奇怪,因为我的Jupyter实际上使用了与Spyder相同的IPython内核.在Jupyter中有效的一点是%time和%timeit命令,但它们只能测量一行代码的运行时间,即必须像
%time blah blah
Run Code Online (Sandbox Code Playgroud)
事实证明,我甚至无法测量for由多条线组成的循环.所以这种方法对我来说并不合适.是否有任何方法可以使用%time(it)Jupyter中的magic命令等来评估单元运行时?
(PS:如果在Spyder中我%time在一个单元格的顶部附加一个命令,它会给出,Wall time: 0 ns因为在同一行中没有任何跟随它的东西,它实际上没有测量任何东西.)
哪种测试更快:平等还是不平等?
例如,在一个大while循环中,条件是否应该a>0而不是a!=0?
python ×5
time ×2
decorator ×1
ipython ×1
operators ×1
optimization ×1
performance ×1
python-3.x ×1
spyder ×1
string ×1