win7運行輸入
成都創新互聯公司主營慶陽網站建設的網絡公司,主營網站建設方案,重慶APP開發公司,慶陽h5小程序開發搭建,慶陽網站營銷推廣歡迎慶陽等地區企業咨詢
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中有很多東西加劇了編譯的難度(因此Nuitka擁有更大的能力來應對這一挑戰)。但是我敢打賭,上面提到的內容在99.9%的情況下都不會使用,因此,如果這些功能沒有實現,那么是否仍可以將其視為“Python”?
具備多少兼容性才有意義?
這個問題我沒有很好的答案。但是這個問題的答案標志著實現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:
self.is_on?=?True
else:
self.is_on?=?False
def?__str__(self):
if?self.is_on?==?True:
return?"I?am?on"
else:
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
def?__str__(self):
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
else:
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
else:
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.filp_every(2)
print(light_board)
light_board.filp(2)
print(light_board)
light_board.reset()
print(light_board)
light_board.filp_every(1)
print(light_board)
有的代碼可以寫得更簡潔,基類已經提供的服務(接口),在派生類中直接使用就可以了。下面的僅供參考。
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):
self.is_on?=?not?self.is_on?##
def?__str__(self):
if?self.is_on?==?True:
return?"I?am?on"
else:
return?"I?am?off"
class?SwitchBoard(LightSwitch):
def?__init__(self,?number):
self._lights?=?[]
for?i?in?range(number):
i?=?LightSwitch(False)
self._lights.append(i)
def?which_switch(self):
result?=?[]
for?i?in?range(len(self._lights)):?##
if?self._lights[i].is_on?==?True:
result.append(str(i))?#
return?result
def?__str__(self):
result?=?self.which_switch()?#
result_str?=?','.join(result)
return?'The?following?switches?are?on:?'?+?result_str
def?filp(self,?n):
self._lights[n].filp()?##
def?filp_every(self,?n):
k?=?0
while?n?*?k?=?len(self._lights)?-?1:
self.filp(n?*?k)?##
k?=?k?+?1
def?reset(self):
for?light?in?self._lights:
light.turn_off()?##
light_board?=?SwitchBoard(10)
print(light_board)
light_board.filp_every(2)
print(light_board)
light_board.filp(2)
print(light_board)
light_board.reset()
print(light_board)
light_board.filp_every(1)
print(light_board)
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行結果
--第一行表示運行這個函數一共使用0.043秒,執行了845次函數調用
--第二行表示結果是按什么順序排列的(這里表示按照調用次數來進行排列的)
--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?裝飾器的開關變量
def?outer(flag):??#step?2
def?wrapper(func):?#step?4
def?inner(*args,**kwargs):?#stpe?6
if?flag:???????????????#step?9
print('before')???#step?10
ret?=?func(*args,**kwargs)??#step?11??執行原函數
print('after')?????????????#step13
else:
ret?=?func(*args,**kwargs)
print('123')
return?ret?????????????????????#step?14
return?inner????#step?7
return?wrapper?????#step?5
@outer(F)???#先執行step?3?:outer(True)這個函數,然后step?6:@wrapper???#此處把開關參數傳遞給裝飾器函數
def?hahaha():
pass????#step?12
hahaha()????#?step?8????相當于inner()
開關參數為False的時候執行過程:
F?=?False??????????#stpe1?裝飾器的開關變量
def?outer(flag):??#step?2
def?wrapper(func):?#step?4
def?inner(*args,**kwargs):?#stpe?6
if?flag:???????????????#step?9
print('before')???
ret?=?func(*args,**kwargs)????
print('after')?????????????
else:
ret?=?func(*args,**kwargs)????#step?10??執行原函數
print('123')?????????????????#step?12
return?ret?????????????????????#step?13
return?inner????#step?7
return?wrapper?????#step?5
這是python自己的說明:
-O : optimize generated bytecode slightly
-O 通常是在將py編譯為pyo而不是pyc,pyo比pyc小一些所以理論上加載速度會快些(注意是加載速度不是執行速度)。
另外還有一個開關是-OO 這是在-O的基礎上再刪除去除assert語句和docstring,但是有些模塊可能會依賴這些語句,所以要慎用這個開關。
網頁題目:python函數開關,Python中常用函數
文章轉載:http://vcdvsql.cn/article0/heohoo.html
成都網站建設公司_創新互聯,為您提供手機網站建設、電子商務、Google、云服務器、響應式網站、
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯