标签: python

如果存储运算形成的“中间量”

如果存储运算形成的“中间量”

 

gossip · 13 小时 21 分钟前 · 863 次点击

断断续续接触 python 其实有一年了,没拿它干过重活儿,还是非常新手的状态。但是进来有个问题让我思考更多:
楼主本身背景经济学,我们经常用的软件包括 R,Stata 这种。笔者更熟练用 Stata

现在在用 python 做点题目,问题描述如下:
好比说我有两个 python 文件 A 和 B,由于两个功能的完全不同,而且为了以后逻辑清楚,特意分成了两个文件写

A 执行之后经过复杂的运算会产生一个列表 m, 我的 B 文件就从 m 开始继续加工 m

这样一来,我只需要运行 B 就行了,想知道如何让 A 中运算产生的 m 在运行 B 的时候自动就当做已知的(当前那环境中就有的)

就好像 A 和 B 连起来一起执行一样?

————————————————–
我遇到这个问题,就在想我貌似之前很少碰到这个问题,于是回想了下这种情景用 Stata 是如何处理的。
是这样的:
一般 A 文件先参与运算,算完之后打开 B 文件,只要 B 文件开头不写清空当前内容,那么 A 得到的结果自然在内存中,接着用就是了。
又或者:
A 文件先参与运算,算完了之后把整个结果(通常是数据集,类似于 python 中的 dataframe )保存成 Stata 的 dta 文件就行,运行 B 的时候,开头调入整个 dta 文件,就 OK 了。

这个问题麻烦在于,我 A 生成的是一个列表,如果我选择 with open…. write 一个文本文件当然可以,然后再从 B 中写一个 with open 读出来用一个列表接收,当然可以,但总觉得“不是那个味道”。

所以感觉 python 这种没有一个变量框全局地储存变量还是与数据软件挺大的不同呢,但今晚遇到问题了,才更有理解一些。

但我觉得,应该是更大的问题是我不太懂 python 的所谓“模块”的概念,既然一切 py 文件皆是模块,我是否可以在 B 中引入 A 中的结果呢,我知道可以引入 A 中的函数等,但是通过 A 运算得到的 m 有没有好的办法呢?

(我的 A 文件就类似于一个面向过程的流水账,一步步计算出结果的这种)
—————————————————-
话比较啰嗦,谢谢大家了

18 条回复    2021-10-15 09:26:33 +08:00
zk123
    1

zk123   13 小时 2 分钟前

共享内存?一个双向队列解决?看了两遍,没太清楚要解决的关键点在哪里
acmore
    2

acmore   13 小时 0 分钟前

其实 with open 用文件才是*正统的风格( Unix ),你的系统盘里就有一大堆这样的中间临时文件。
不过这个问题是不是可以用一个 main 函数来解决,main 调用 A 得到结果再传给 B,一切都在内存里发生。

Python 的模块引用的都是代码,而不是运行的结果。

GeruzoniAnsasu
    3

GeruzoniAnsasu   12 小时 58 分钟前

> 感觉 python 这种没有一个变量框全局地储存变量还是与数据软件挺大的不同呢

有。

正经编程语言会有「作用域」的概念,参与运算的变量会分层暴露在各自的「作用域」里,越「内部」或者说越「局部」的变量,就越不可能被外界看到。

与之相反的,如果一个变量处于「全局作用域」中,那就可以在全局范围内引用,跟引用函数 /类 是一样的。

假设 A 文件有一个计算过程 calcNumA,*后得出来一个临时结果,你可以把临时结果直接放到文件*外面,比如

ACache = None
def calcNumA(args):
“…
“global ACache
“ACache = results

然后引入它:

import A

if A.ACache=None:
“A.calcNumA(…)

但良好的程序设计会遵循一定的设计规范和*佳实践,不会像这样直接暴露变量。此处展开就太多了,这个问题可以先不管,建议以后代码写多了慢慢填

GeruzoniAnsasu
    4

GeruzoniAnsasu   12 小时 57 分钟前

至于列表,不是有{}和[]吗
rpman
    5

rpman   12 小时 57 分钟前 via iPhone   ❤️ 1

假设你是写好文件然后跑 .py ,一般做法是用 pickle 把对象存成文件,然后下一个脚本载入对象
如果要模仿统计软件里的体验,*简单方法是用 jupyter notebook,想跑哪个 cell 就跑哪个 cell,变量在同一个 notebook 里共享
ch2
    6

ch2   12 小时 56 分钟前

需要有“进程”这个概念
你的问题本质上是一个进程执行完之后如何让中间结果留给下一个进程接着用
还额外蕴含了一个信息:*次执行完毕后你想让进程驻留,只保留数据,第二次运行还要使用新的代码,这是很难以方便直观的方法做到的
一次代码的运行会创建一个进程,它可以使用多个源代码模块。但是两次代码执行之间想要互通数据就得借助于外部手段,写文件是其中一种
如果你不想借助外部方法,就得把多次运行改进成一次运行,这样始终只会创建一个进程,就不需要走进程共享这一套流程了
rpman
    7

rpman   12 小时 53 分钟前 via iPhone

至于真正生产代码,都会把功能都封装成函数,脚本只负责调用
nuistzhou
    8

nuistzhou   12 小时 52 分钟前 via iPhone

不需要啥临时文件。这…在 B 里直接调用 A 的函数就好了啊。具体来说,你在 A 里的计算逻辑写成一个 返回结果(对你来说这里是可能是 df )的函数,然后在 B 里调用 A 的这个函数并运行,结果自然就可以作为一个 B 里的变量直接用。
SenLief
    9

SenLief   12 小时 49 分钟前

模块?
jmc891205
    10

jmc891205   10 小时 32 分钟前 via iPhone

把 A 里的逻辑封装成函数 在 B 里调用返回 m
Livid
    11

Livid   V2EX Moderator   10 小时 32 分钟前 via iPhone

https://github.com/redis/redis-py
kilasuelika
    12

kilasuelika   7 小时 47 分钟前 via Android

看你的表述,你需要应该是在同一个环境下执行 2 个文件:
exec(open(“filea.py”).read())
exec(open(“fileb.py”).read())

这样 fileb 中可以直接用 filea 中的变量

dangyuluo
    13

dangyuluo   6 小时 26 分钟前

如果 AB 是不同进程的话,一定不想存到文件里,可以考虑一种 IPC
ruxuan1306
    14

ruxuan1306   6 小时 8 分钟前

看描述感觉你好像是在用 Matlab 、PyCharm 那种交互式的、可以保持上下文的执行工具。

模块化的做法是:
A 文件里内容写成一个大函数,B 文件里内容也写成一个大函数,然后建立一个`main.py`文件,导入 A 、B 文件内的两个函数,于是你就可以先执行 A 先获得中间结果:`data = A()`,再将中间结果喂给 B:`result = B(data)`。

未来直接运行`main.py`即可。

iceheart
    15

iceheart   1 小时 14 分钟前 via Android

用 mq 啊
zjsxwc
    16

zjsxwc   1 小时 6 分钟前

python 保存 session 状态还是很简单的,仅仅只需要对 globals()进行操作就行。

https://stackoverflow.com/questions/2960864/how-to-save-all-the-variables-in-the-current-python-session#answer-2961077

oott123
    17

oott123   58 分钟前

我倒觉得你需要的是一个 Jupyter Notebook
gaint97
    18

gaint97   19 分钟前 via iPhone

我也是小白,感觉把 Adefine 个函数可行

python获取网页响应时间

  1. “””
  2. 描述:获取网页的响应时间r.elapsed.total_seconds (计算的是从发送请求到服务端响应回来这段时间)
  3. “””
  4. import requests
  5. r = requests.get(“http://www.cnblogs.com/yoyoketang/”)
  6. print(r.elapsed)
  7. print(r.elapsed.total_seconds())
  8. print(r.elapsed.microseconds) #网上很多资料写的是用microseconds获取响应时间,再除1000*1000得到时间为秒的单位,当请求小于1s时,发现不出什么问题。如果时间超过1s,问题就来了。
  9. # (很显然,大于1s的时候,只截取了后面的小数部分)3.所以获取响应时间的正确姿势应该是:r.elapsed.total_seconds(),单位是s
  10. print(r.elapsed.seconds)
  11. print(r.elapsed.days)
  12. print(r.elapsed.max)
  13. print(r.elapsed.min)
  14. print(r.elapsed.resolution)
  1. “””
  2. 输出:
  3. 0:00:00.061597
  4. 0.061597
  5. 61597
  6. 0
  7. 0
  8. 999999999 days, 23:59:59.999999
  9. -999999999 days, 0:00:00
  10. 0:00:00.000001
  11. “””

PYTHON 获取淘宝服务器时间 显示在tkinter的UI

代码

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import tkinter
import http.client
import time

def get_webservertime(host):
conn = http.client.HTTPConnection(host)
conn.request(“GET”, “/”)
r = conn.getresponse()
ts = r.getheader(‘date’) # 获取http头date部分
# 将GMT时间转换成北京时间
ltime = time.strptime(ts[5:25], “%d %b %Y %H:%M:%S”)
ttime = time.localtime(time.mktime(ltime) + 8 * 60 * 60)
dat = “%u-%02u-%02u” % (ttime.tm_year, ttime.tm_mon, ttime.tm_mday)
tm = “%02u:%02u:%02u” % (ttime.tm_hour, ttime.tm_min, ttime.tm_sec)
return tm

def tick():
global time1
# 获取时间
time2 = get_webservertime(‘www.taobao.com’)
# 如果时间发生变化,代码自动更新显示的系统时间
if time2 != time1:
time1 = time2
clock.config(text=time2)
# calls itself every 200 milliseconds
# to update the time display as needed
# could use >200 ms, but display gets jerky
clock.after(200, tick)

win = tkinter.Tk()
win.title(“获取淘宝服务器时间”)
time1 = ”
clock = tkinter.Label(win, font=(‘times’, 100, ‘bold’), bg=’green’)
clock.grid(row=0, column=1)
tick()
win.mainloop()

效果
%title插图%num

python 获取文件修改和创建时间

filemt= time.localtime(os.stat(filename).st_mtime)
print time.strftime(“%Y-%m-%d”,filemt)

import os.path, time
import exceptions

class TypeError (Exception):
pass

if __name__ == ‘__main__’:
if (len(os.sys.argv) < 1):
raise TypeError()
else:
print “os.sys.argv[0]: %s” % os.sys.argv[0] # os.sys.argv[0] is the current file, in this case, file_ctime.py
f = os.sys.argv[0]
mtime = time.ctime(os.path.getmtime(f))
ctime = time.ctime(os.path.getctime(f))
print “Last modified : %s, last created time: %s” % (mtime, ctime)
#该代码片段来自于: http://www.sharejs.com/codes/python/5074

import os,time
time.ctime(os.stat(“c:/1.txt”).st_mtime) #文件的修改时间
time.ctime(os.stat(“c:/1.txt”).st_ctime) #文件的创建时间

time.localtime(os.stat(“F:/log.txt”).st_mtime) #文件访问时间 适合计算时间

ModifiedTime=time.localtime(os.stat(“F:/log.txt”).st_mtime) #文件访问时间
y=time.strftime(‘%Y’, ModifiedTime)
m=time.strftime(‘%m’, ModifiedTime)
d=time.strftime(‘%d’, ModifiedTime)
H=time.strftime(‘%H’, ModifiedTime)
M=time.strftime(‘%M’, ModifiedTime)

d2=datetime.datetime((int)y,(int)m,(int)d,(int)H,(int)M)
同理d1….

(d1-d2).seconds #为d1与d2相隔十分钟

参考:
使用datetime模块可以很方便的解决这个问题,举例如下:
>>> import datetime
>>> d1 = datetime.datetime(2005, 2, 16)
>>> d2 = datetime.datetime(2004, 12, 31)
>>> (d1 – d2).days
47
上例演示了计算两个日期相差天数的计算。
import datetime
starttime = datetime.datetime.now()
#long running
endtime = datetime.datetime.now()
print (endtime – starttime).seconds
上例演示了计算运行时间的例子,以秒进行显示。
>>> d1 = datetime.datetime.now()
>>> d3 = d1 + datetime.timedelta(hours=10)
>>> d3.ctime()

 

使用python监控NTP系统(时钟服务器)

背景
背景很简单,内部NTP系统出现故障,时间不准确,且误差很大。

需求
监控NTP系统运行状态,与正确时间进行对比,并计算偏差值。

设计
利用python模拟NTP client,分别从内部NTP系统和Internet NTP系统获取时间,并计算2个时间的差值。

实现
实现起来也很简单,用ntplib 和 time 2个库搞定。

简要说明一下:
1.‘pool.ntp.org’ 是来自互联网的时间服务器虚拟集群。
2.ctime函数将类似‘16574833.8934’格式时间转换为易读字符串格式。
3.可使用schedule库将程序定时执行,取相应返回值。
4.前端可以使用grafana或splunk等进行展示。

示例代码如下:

import ntplib
import time

ntp_client = ntplib.NTPClient()
response_outside= ntp_client.request(‘pool.ntp.org’).tx_time
print(‘互联网时间: ‘, time.ctime(response_outside))
response_inside = ntp_client.request(‘192.168.100.5’).tx_time
print(‘内部时间: ‘, time.ctime(response_inside))

print(‘时间差值: ‘, response_inside – response_outside)

运行结果:
%title插图%num %title插图%num

python中的传值和传引用

和其他语言不一样,传递参数的时候,python不允许程序员选择采用传值还是传引用。Python参数传递采用的肯定是“传对象引用”的方式。实际上,这种方式相当于传值和传引用的一种综合。如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值--相当于通过“传引用”来传递对象。如果函数收到的是一个不可变对象(比如数字、字符或者元组)的引用,就不能直接修改原始对象--相当于通过“传值’来传递对象。

python一般内部赋值变量的话,都是传个引用变量,和C语言的传地址的概念差不多。可以用id()来查询内存地址

如果a=b的话, a和b的地址是相同的;如果只是想拷贝,那么就得用 a=b[:]。

!!!注意这一点,这可是可以引起重大错误的。。。

自学Python中,想自己买网络代理,该如何操作?

%title插图%num 如果是新手小白,自学Python阶段,没必要投入那么大。
如果你的目标网站只是自己的blog,网络代理ip是*佳选择了,普通匿名代理足够用了,购买高匿名代理ip也是不错的选择。
那么,自己购买网路代理,该怎么区分ip匿名度呢?

%title插图%num

httproxy:*常用的代理,代理客户端http访问,主要是代理浏览器访问网页,其端口通常是80,8080,3128等等。
HTTPS代理也称为SSL代理:http代理支持*高128位的加密强度,可用于访问加密站点。加密站点是指以https//开头的站点。标准端口sl为443。
HTTPCONNECT代理:允许用户在任何端口上建立TCP连接的代理服务器,不仅可以在HTTP上使用,也可以在FTP,IRC,RM流服务等方面使用。
socks代理:全能代理,就像有很多跳线的转接板一样,只是将一端的系统连接到另一端。对各种协议的支持,包括http请求、ftp请求和其他请求。该协议分为socks4和socks5两种,socks4只支持TCP协议,socks5支持TCP/UDP协议,同时还支持各种认证机制等。它的标准端口是1080。
TUNNELAgent:通过HTTPTunnet程序转换的数据包封装成http请求(Request)以穿透防火墙,允许HTTP服务器执行任何TCP可以执行的操作,其功能与Socks5相同。
教育网络代理:指学术教育机构的局域网,通过特定的代理服务器,可以让不具有出国权限或者不能访问IP段的计算机访问相关资源。
socks5代理:应用于socks5代理,可以认为socks5代理是动态加密的,也可以直接在PSD软件中使用。通常的端口是1813。
代理:在客户端代理ssso程序来访问远程网站,使用SSL加密的超级代理,支持socks。
如果业务类型对个人信息安全的要求比较高,建议使用高安全性的代理IP。

服务器端配置python运行环境与py文件的运行

配置python环境
我这里只配置了anaconda环境,安装anaconda时需要注意python的版本。
目前很多库对python3.7的支持还不够,依然选择3.6版本。
anaconda官方网站给的anaconda下载链接内置的是python3.7。
可以从下面这个网站中找到anaconda发行的每一个版本:https://repo.continuum.io/archive/
安装教程很多,可以参考这博客或者这博客。

安装所需要的包
根据运行的py文件所需要的包,使用conda install。

py文件的运行
切换到python文件的目录下,给脚本文件运行权限: chmod 755 ./*.py
执行文件:python ./test.py

如果在脚本内容的开头已经给出了类似于如下的注释:#!/usr/bin/env python或者#!/usr/bin/python
切换到python文件目录直接运行:test.py

对于注释头#!/usr/bin/python或者#!/usr/bin/env python
#!/usr/bin/python 是告诉系统使用哪个编译器去执行当前文件。 这里的python是linux自带的python,但是其版本不一定适合当前我们编写的代码。
于是就有了#!/usr/bin/env python, 这里建立了自己的环境,用自定义环境里面的python执行文件。

服务器上使用python

工具:

服务器
xshell
xftp
网页访问服务器方法:

登录xshell,连接到服务器地址。 输入ipython notebook得到一个端口号例如1990
在网页中输入:https://10.117.63.32:9990 看到的是一个目录,进去你想要创建或者查看的目录搞事情。

传输文件

小型文件直接拖拽到服务器上面; 大文件可以用xftp传输,在xshell点击上方
新建文件传输c+a+f,弹出来xftp(前提:安装了xftp)

ipython的使用

只有python2版本可供选择
可以分段式编译,例如import……为*段,之前解释好的内容会保存在服务器里面,这样对于大型代码不会每次都从头开始运行。接着解释例如读入文件的代码,再接着保存参数有关的代码等等。
注意:每次离开的时候如果程序不要运行记着shutdown。

ios-deploy时,终端构建失败

安装ios-deploy时,终端构建失败:
ios-deploy是一个从mac电脑把app打包到手机的工具
安装:sudo npm install -g ios-deploy –unsafe-perm=true

安装出现问题:
** BUILD FAILED **
The following build commands failed:
CompileC /usr/local/lib/node_modules/ios-deploy/build/ios-deploy.build/Release/ios-deploy-lib.build/Objects-normal/x86_64/libios_deploy.o /usr/local/lib/node_modules/ios-deploy/src/ios-deploy-lib/libios_deploy.m normal x86_64 objective-c com.apple.compilers.llvm.clang.1_0.compiler
(1 failure)
npm ERR! code ELIFECYCLE
npm ERR! errno 65
npm ERR! ios-deploy@1.11.0 preinstall: ./src/scripts/check_reqs.js && xcodebuild`
npm ERR! Exit status 65
npm ERR!
npm ERR! Failed at the ios-deploy@1.11.0 preinstall script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

解决方式:
需要把macOS,ios,xcode版本号升级为一致,因为用命令安装的时候默认安装*新的ios-deploy,而电脑的配置不相符:

升级之后执行
终端运行:sudo xcode-select –switch /Applications/Xcode.app/Contents/Developer
在执行:sudo npm install -g ios-deploy –unsafe-perm=true
open /Applications/Xcode.app/Contents/Developer

安装成功

友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速