一些关于 Python 编程的疑惑

2023-06-07 22:34:19 +08:00
 marin11
我现在编写 python 程序时,基本上都是在使用.ipynb 而不是.py
但是我依赖.ipynb 的主要原因是 ipynb 可以创建单元格允许我只运行一部分代码,
而不是他提供的交互性(比如直接显示图片和输出结果之类的)
所以让我感觉有点违和感。。。

具体来说 ipynb 可以允许我只运行一部分代码,即使报了 BUG ,
我也知道只是我最近写的一个单元格里的代码出问题了,而不是之前的某一部分代码出了问题。
但是其他编程语言中并没有 ipynb 这个文件格式,我在在想他们 debug 应该都是怎么做的?
这是不是因为我不会断点调试而导致我依赖 ipynb

举一个具体的例子:
我从原文件提取了很多特征量,用来作为模型的输入,之后我会定义一个 Model 来训练。
如果使用 ipynb ,我可以在一个单元格里提取了这些特征量,然后在下一个单元格里定义 model ,即使 model 定义错了(比如模型输入 size 和特征量 size 不符),我也可以直接在第二个单元格里修改,而不用从头开始执行特征提取这一步。
但是用.py 就要从头开始执行,又要浪费时间提取一遍特征量就很麻烦。。
2307 次点击
所在节点    程序员
19 条回复
shinsekai
2023-06-07 22:38:36 +08:00
matlab 的话可以用 mlx 实时脚本或者使用%%分段运行
Alias4ck
2023-06-07 23:12:05 +08:00
可是你工程化的时候就不能这么做了啊
thinkershare
2023-06-07 23:39:12 +08:00
基本的不需要 Debug, Debug 也是跑 UnitTest/Log/端点单步调试, 任何工程性质的项目都不会使用 ipynb 这种模式,这个模式只是提供给交互场景这种及其有限情况下使用的。
eagleoflqj
2023-06-07 23:41:01 +08:00
ipynb 就是用来干这个的,其他语言要么也有这种功能(比如 mathematica ),要么压根不适合做数据处理
当你用 python 做别的,比如写 django 后端,自然就不用 ipynb 了
lithiumii
2023-06-07 23:41:07 +08:00
因为你在做的事情是探索性、实验性的,人为介入是流程的一部分,最终成果不一定是代码而是某个问题的答案,所以写一段跑一段改一段很方便。MATLAB 和 R 的用户也是这样。

写工程代码的人,交付的是代码,代码要在无人介入的情况下跑千遍万遍无数遍。在代码能这样跑起来之前,也有逐步运行或者分割运行的情况,可以靠 debugger 或者自动重载的调试模式、单元测试、打日志、反复运行看结果等等。

此外,其实 Jupyter 可以跑很多很多语言,名字里就有仨( Julia 、Py 、R ),此外什么 C 啊 C++ 啊 JS 啊等等都有。
geekdonie
2023-06-08 00:41:05 +08:00
有需求,使用合适的解决方案,没什么可疑惑的
zhzy
2023-06-08 00:52:24 +08:00
支持 rrpl 的语言都可以吧,只是可能没有一个像 ipynb 那样具体的文件
zhzy
2023-06-08 00:52:46 +08:00
@zhzy repl 打错了
pcbl
2023-06-08 01:09:34 +08:00
只能说羡慕楼主工作中可以写这种各部分关联性不强的代码。我这边生产用到的代码已经是面条状态了,想单独调试运行一部分那是不可能的。
dayeye2006199
2023-06-08 01:19:26 +08:00
LZ 你需要的就是 literate programming 。边写程序边研究下面怎么干。

如果你想写出比较健壮的代码,可以采用测试驱动编程。

比如先写特征处理的代码,然后把形状、结果的数字什么的编写到测试里。然后再去做代码实现。
跑测试的时候,可以整个测试数据集,数量小一些,可以比较快的得到结果。
Contextualist
2023-06-08 01:32:19 +08:00
越过现象看本质:无论什么领域的代码、无论多大规模的项目,维护靠的都是模块化,即把一个项目拆分成尽量相互独立的部分,以便管理维护。

对于一个 .ipynb 文件,单元格就是一种模块化。而一个组织良好的 Python 项目并不会是单个 .py 文件,而是会包含许多相互依赖的 .py 文件和文件夹,它们构成了 Python 模块化中的包( package )和模组( module )。

以 debug 举例,一个 Python 项目中,一个 .py 文件实现一个具体的功能,与之对应的一个单元测试文件针对性验证这个 .py 文件的功能。所以很多时候 debug 并不用运行整个项目,而是单独运行查验一个单元测试文件。

最后多讲两句,.ipynb 是快速验证想法或者做小 demo 的利器。但如果一个项目持续增长到一定规模,最终还是整理成一个 Python 的包更有利于长期维护,因为线性组织的 .ipynb 很难维护多层的依赖关系,而且版本控制也比较困难。再说你写成一个包也是可以在 .ipynb 里导入使用的。
shinession
2023-06-08 08:36:18 +08:00
python 据说就是 jupyter notebook 火起来之后位列第一的, 对新手非常友好, 适合入门, 可以一步一步的得到想要的结果, 但是对大佬来说这功能可有可无
silkriver
2023-06-08 10:04:59 +08:00
vscode 也支持只运行.py 中的一部分代码,当然直接 vscode 运行.ipynb 更方便
uni
2023-06-08 10:19:36 +08:00
这就是做草稿嘛,我也经常这么做(你们 py 工程师都是靠试的吗.jpg
我用的 vscode 的# %%,感觉比 jupyter 方便很多
ruanimal
2023-06-08 10:55:21 +08:00
@uni 我们炼丹工程师是这样的
smallsung
2023-06-08 11:28:04 +08:00
感觉特征向量提取后可以存到硬盘上,没必要每次运行都重新提取一次吧,还挺耗时间的。
InvincibleDream
2023-06-08 11:30:18 +08:00
ipynb 相当于记事本,py 相当于扳手或者齿轮。记事本是用来读的,扳手或者齿轮是用来操作或者作为机器本身工作的。
cordea
2023-06-08 13:14:26 +08:00
类似.ipynb 的这种东西并不是 python 独有,支持 repl 的语言都能做到类似的事,像 commonlisp 这种语言甚至就是鼓励你用 repl 来写到哪里执行到哪里。

再说 debug ,debug 是一种最后的手段,在理想情况下,潜在的错误应该在执行程序前就被发现。而找到程序执行结果与期望不一致的原因并不一定要通过“实际去运行程序”来完成。类似于 haskll ,idris 这样的语言,能够在类型层面确保程序的一致性,使用这样的语言很少需要依赖 debug 这种最后的手段。

以楼主的例子来说,模型输入 size 和特征量 size 不符,如果编程语言支持依赖类型之类的高级特性,会直接在运行前就提示你类型不符,就像往一个只接受 int 的函数里传入 string 一样。

而对于更一般的语言,比如 cpp ,由于设计上的取舍,类型系统的缺陷等等,则不得不依赖 debug 或者程序员的经验来找出错误。
marin11
2023-06-08 15:11:26 +08:00
@pcbl 我其实也很想有这种能处理大量相互依赖的代码的能力,但我现在不知道怎么培养。。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/946770

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX