shell:Startup
在路径下面类似
C:\Users\Default\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\文件夹下把你要放的python文件放进去~~
开机就运行~
有的一般病毒都是在这应该开机启动
我真正开始思考这个问题是当我开始思考将Python编译成WebAssembly都需要什么的时候.这并不是要实现另一个解释器,而是从Python源代码产生静态的WebAssembly,并且它依然可以称为"Python"
我知道的,通过eva()或compile()进行动态编译可能不容易实现,因为WebAssembly的安全模型会在加载时验证模块.这意味着没有办法在其他代码的内存空间内运行任意代码,这可能会加剧实现REPL的难度.
但这让我思考:Python真的需要REPL吗?别误会我的意思,它非常方便,但是我的意思是,如果某个实现不包含REPL,那么它还是Python吗?我认为无REPL的Python仍然是Python,只是缺少可能是关键的核心功能.
这不禁让我思考必须将Python的哪些部分视为" Python"的想法.
没有locals()行不行?能够将定义的所有局部变量及其值都收集到一个字典中,这是非常动态的东西.如果你使用像CPython这种解释器,那么只需要从当前的执行帧里取一些东西就能获得locals.但在编译语言中,实现这一点需要大量工作,因为你必须知道应当何时收集这些信息,因为调用locals()的时候并不一定所有信息都存在.
如果有人重载了locals()怎么办?同样,在CPython中这也不是什么问题,因为builtins模块有一个__dict__属性,只需要重载它,就会向下传递到以后的调用中.但在编译语言中,做类似的检测需要大量的工作,最终会影响性能.
那么sys.settrace()呢?它会触发每个字节的回调,而如果代码已经编译,这一点是无法实现的.尽管你可以通过检查每行末尾是否设置了跟踪函数来模仿这一行为,但这似乎有点过了,因为绝大多数情况下这种钩子并不存在(尽管可以实现为编译器开关).
那么sys._getframe()呢?编译语言并不一定能够直接访问每个执行帧,那么你还要不要模拟这一行为?由于任何函数都可以请求执行帧,你必须时刻准备着提供执行帧.
具备多少兼容性才有意义?
这个问题我没有很好的答案.但是这个问题的答案标志着实现Python的难度以及与现有软件的兼容性.我会说,我认为WebAssembly不需要支持大量的Python软件.WebAssembly可以访问Rust和JavaScript等其他语言生态系统,所以呢你需要的某个东西完全有可能在其他语言中已经实现了.
我没有答案
也许我们可以开发一个将Python代码直接转换为WebAssembly并牺牲性能兼容性的编译器.也许我们可以开发针对WebAssembly设计的解释器,同时与先前已有的代码保持兼容性.也许可以仅在其WebAssembly工作中支持RustPython.也许Pyodide可以实现这一点.我认为这些都有可能,这些都有可能激发人们的兴趣,进而产生更好的结果.
#?标有"#"的行是修改过的,对比一下看看.
class?LightSwitch:
def?__init__(self,condition):
self.is_on?=?condition
if?not?isinstance(condition,bool):
InvaildSwitchExpection?=?TypeError("it?is?not?a?right?state".format(condition))
raise?InvaildSwitchExpection
def?turn_on(self):
self.is_on?=?True
def?turn_off(self):
self.is_on?=?False
def?filp(self):
if?self.is_on?==?False:
else:
def?__str__(self):
if?self.is_on?==?True:
return?"I?am?on"
return?"I?am?off"
class?SwitchBoard(LightSwitch):
def?__init__(self,?number):
self._lights?=?[]
for?i?in?range(0,?number):
i?=?LightSwitch(False)
self._lights.append(i)
def?which_switch(self):
result?=?[]
for?i?in?range(0,?len(self._lights)):
if?self._lights[i].is_on?==?True:
result.append(str(i))?#
return?result
result?=?self.which_switch()?#
result_str?=?','.join(result)
return?'The?following?switches?are?on:?'?◆?result_str
def?filp(self,?n):
if?self._lights[n]?==?False:
self._lights[n].is_on?=?True
self._lights[n].is_on?=?False
def?filp_every(self,?n):
k?=?0
while?n?*?k?=?len(self._lights)?-?1:
if?self._lights[n?*?k].is_on?==?False:
self._lights[n?*?k].is_on?=?True
self._lights[n?*?k].is_on?=?False
k?=?k?◆?1
def?reset(self):
for?light?in?self._lights:
light.is_on?=?False?#
light_board?=?SwitchBoard(10)
print(light_board)
light_board.reset()
light_board.filp_every(1)
有的代码可以写得更简洁,基类已经提供的服务(接口),在派生类中直接使用就可以了.下面的仅供参考.
self.is_on?=?not?self.is_on?##
for?i?in?range(number):
for?i?in?range(len(self._lights)):?##
self._lights[n].filp()?##
self.filp(n?*?k)?##
light.turn_off()?##
Python中提供了很多接口方便我们能够灵活进行性能分析,包括cProfile模块中的Profile类和pstat模块中的Stats类.
--cprofile是一种确定性分析器,只测量CPU时间,并不关心内存的消耗情况和其他与内存相关联的信息
--它是基于Isprof的用C语言实现的扩展应用,运行开销比较合理,适合分析运行时间较长的程序
--enable(): 开始进行性能分析并收集数据
--disableI(): 停止性能分析
--create_stats(): 停止收集数据,并为已经收集的数据创建stats对象
--print_stats():创建stats对象并打印分析结果
--dump_stats(filename): 把当前性能分析的内容写入文件filename中
--runcall(func, *args, **kwargs): 收集被调用函数func的性能分析信息
--用来分析cProfile输出的文件内容
--pstas模块为开发者提供了Stats类,可以读取和操作stats文件
(Stats类可以接受stats文件名,也可以直接接受cProfile.Profile对象作为数据源.)
--strip_dirs(): 删除报告中所有函数文件名的路径信息
--dump_stats(filename): 把stats中的分析数据写入文件(也可以写成cProfile.Profile.dump_stats())
--sort_stats(*keys): 对报告列表进行排序,函数会一次按照传入的参数排序
--reverse_order(): 逆反当前的排序
--print_stats(*restrictions): 把信息打印到标准输出.*restrictions用于控制打印结果的形式,比如(10,1.0,".*.py.*")表示打印所有py文件的信息的前10行结果
--第二行表示结果是按什么顺序排列的(这里表示按照调用次数来进行排列的)
--ncalls: 表示函数调用的次数(有两个数值表示有递归调用,总调用次数/原生调用次数)
--tottime: 函数内部调用时间(不包括他自己调用的其他函数时间)
--percall: tottime/ncalls
--cumtime: 表示累计调用时间(函数执行玩的总时间),它包含了函数自己内部调用的函数时间
--filename:lineno(function): 函数所在的文件,行号,函数名称
上面的函数do_cProfile(do=False, order='tottime')是一个带参数的装饰器,通过do的值来进行性能分析的开关控制,通过order的值来选择输出结果按照什么方式进行排序.
比如我们对函数A和函数B进行性能分析
如果不给装饰器传入参数的话就是默认的False和tottime
装饰器本身是用来是为一个函数是实现新的功能,并且不改变原函数的代码以及调用方式.
遇到这样一种问题:
众多函数调用了你写的装饰器,但客户有需求说,我想实现我可以随之控制装饰器是否生效.
那你就不可能在得到命令的时候去原函数头部去做删除和添加装饰器调用的命令.这是就可以用到带参数的装饰器,定义一个开关,调用装饰器的时候,把这个装饰器的开关参数给传递进去,这样当开关打开的时候装饰器生效,关闭的时候则只执行原函数的代码.
举例:开关参数为True的时候执行过程:
F?=?True??#step?1?装饰器的开关变量
print('before')?#step?10
ret?=?func(*args,**kwargs)?#step?11?执行原函数
ret?=?func(*args,**kwargs)
def?hahaha():
开关参数为False的时候执行过程:
F?=?False??#stpe1?装饰器的开关变量
print('before')?
ret?=?func(*args,**kwargs)?
print('after')???
ret?=?func(*args,**kwargs)?#step?10?执行原函数
这是python自己的说明:
-O : optimize generated bytecode slightly
-O 通常是在将py编译为pyo而不是pyc,pyo比pyc小一些所以理论上加载速度会快些(注意是加载速度不是执行速度).
另外还有一个开关是-OO 这是在-O的基础上再删除去除assert语句和docstring,但是有些模块可能会依赖这些语句,所以要慎用这个开关.
以上就是土嘎嘎小编为大家整理的python函数开关相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!