V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
marin11
V2EX  ›  程序员

一些关于 Python 编程的疑惑

  •  
  •   marin11 · 2023-06-07 22:34:19 +08:00 · 2252 次点击
    这是一个创建于 521 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我现在编写 python 程序时,基本上都是在使用.ipynb 而不是.py
    但是我依赖.ipynb 的主要原因是 ipynb 可以创建单元格允许我只运行一部分代码,
    而不是他提供的交互性(比如直接显示图片和输出结果之类的)
    所以让我感觉有点违和感。。。

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

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

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

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

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

    比如先写特征处理的代码,然后把形状、结果的数字什么的编写到测试里。然后再去做代码实现。
    跑测试的时候,可以整个测试数据集,数量小一些,可以比较快的得到结果。
    Contextualist
        11
    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
        12
    shinession  
       2023-06-08 08:36:18 +08:00
    python 据说就是 jupyter notebook 火起来之后位列第一的, 对新手非常友好, 适合入门, 可以一步一步的得到想要的结果, 但是对大佬来说这功能可有可无
    silkriver
        13
    silkriver  
       2023-06-08 10:04:59 +08:00
    vscode 也支持只运行.py 中的一部分代码,当然直接 vscode 运行.ipynb 更方便
    uni
        14
    uni  
       2023-06-08 10:19:36 +08:00
    这就是做草稿嘛,我也经常这么做(你们 py 工程师都是靠试的吗.jpg
    我用的 vscode 的# %%,感觉比 jupyter 方便很多
    ruanimal
        15
    ruanimal  
       2023-06-08 10:55:21 +08:00
    @uni 我们炼丹工程师是这样的
    smallsung
        16
    smallsung  
       2023-06-08 11:28:04 +08:00
    感觉特征向量提取后可以存到硬盘上,没必要每次运行都重新提取一次吧,还挺耗时间的。
    InvincibleDream
        17
    InvincibleDream  
       2023-06-08 11:30:18 +08:00
    ipynb 相当于记事本,py 相当于扳手或者齿轮。记事本是用来读的,扳手或者齿轮是用来操作或者作为机器本身工作的。
    cordea
        18
    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
        19
    marin11  
    OP
       2023-06-08 15:11:26 +08:00
    @pcbl 我其实也很想有这种能处理大量相互依赖的代码的能力,但我现在不知道怎么培养。。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1573 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 17:03 · PVG 01:03 · LAX 09:03 · JFK 12:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.