小编vla*_*fol的帖子

python"如果len(A)不是0"vs"如果A"语句

我的同事在条件下使用这种方式

if len(A) is not 0:
    print('A is not empty')
Run Code Online (Sandbox Code Playgroud)

我更喜欢这个

if A:
    print('A is not empty')
Run Code Online (Sandbox Code Playgroud)

什么是prop-cons论点?

她的观点是,第一种方式是更直接的方式来展示她究竟想要什么.我的观点是我的方式更短.

第一种方式比我的方式快2倍:

>>> import timeit
>>> timeit.timeit('len(A) is not 0', setup='A=[1,2,3]')
0.048459101999924314
>>> timeit.timeit('bool(A)', setup='A=[1,2,3]')
0.09833707799998592
Run Code Online (Sandbox Code Playgroud)

>>> import timeit
>>> timeit.timeit('if len(A) is not 0:\n  pass', setup='A=[1,2,3]')
0.06600062699999398
>>> timeit.timeit('if A:\n  pass', setup='A=[1,2,3]')
0.011816206999810674 
Run Code Online (Sandbox Code Playgroud)

第二种方式快6倍!我很困惑如何if工作:-)

python pep8

7
推荐指数
2
解决办法
821
查看次数

从外部文件加载配置的最佳PySpark做法是什么

我想一次初始化配置,然后在我的PySpark项目的许多模块中使用它。

我看到两种方法。

  1. 在入口点加载它,并作为参数传递给每个函数

main.py:

with open(sys.argv[1]) as f:
    config = json.load(f)
df = load_df(config)
df = parse(df, config)
df = validate(df, config, strict=True)
dump(df, config)
Run Code Online (Sandbox Code Playgroud)

但是将一个外部参数传递给每个函数似乎并不美观。

  1. 在config.py中加载config并将该对象导入每个模块

config.py

import sys
import json
with open(sys.argv[1]) as f:
    config = json.load(f)
Run Code Online (Sandbox Code Playgroud)

main.py

from config import config
df = load_df()
df = parse(df)
df = validate(df, strict=True)
dump(df)
Run Code Online (Sandbox Code Playgroud)

并在每个模块中添加行

from config import config
Run Code Online (Sandbox Code Playgroud)

看起来更美,因为严格来讲config不是函数的参数。这是它们执行的一般上下文。

不幸的是,PySpark pickle config.py试图在服务器上执行它,但是没有将sys.argv传递给他们!所以,我在运行时看到错误

  File "/PycharmProjects/spark_test/config.py", line 6, in <module>
    CONFIG_PATH = sys.argv[1]
IndexError: list index out of range
Run Code Online (Sandbox Code Playgroud)

在PySpark中处理从文件加载的常规配置的最佳实践是什么?

python config pyspark

5
推荐指数
1
解决办法
2405
查看次数

Mindustry Game CPU 架构的最简单编译器

我玩了一个很棒的沙盒塔防游戏Mindustry

很酷的事情是您可以使用游戏嵌入式处理器块来控制单元。你可以命令他们建造积木、在地图上巡逻、包围最弱的敌人、治疗朋友并将弹药带到炮塔。

有一些示例如何对此类块进行“编程”:

一些“文档”可以在这里找到:

问题是处理器“语言”非常原始。只有一个控制语句:jump-to-line-if-statement-is-true. 没有 if/else 语句,没有 for 循环,没有函数和类。因此,使用这些指令编写任何复杂的东西几乎是不可能的。

所以我的想法是让我自己的简单编译器从“真正的”编程语言(带有 if、else、for、function、struct/class)到这些原始指令,然后将其导出到游戏中。

我的第一个想法是在 Mindustry 中实现 JVM 或 LLVM-IR VirtualMachine 来运行编译后的字节码,但它看起来很复杂。这些字节码中有很多指令。

然后我考虑实现 Lua 或简化的 Python 解释器,它看起来是可能的,但无论如何这是一项艰巨的工作:-)

我很好奇最简单的方法:-) 也许有基于 ~10 条指令或一些示例项目的简化 JVM/LLVM 字节码,或者在 Brainfuck 或一些有限的架构上运行 Lua/Python :-)

====嵌入式CPU语言====

所以控制指令集是:

  • read - 从 PermanentStorage 地址读取数据到变量
  • write - 将数据从变量写入到 PermanentStorage
  • set - 设置变量数据
  • 链接 - 从数组中获取第 i 个元素
  • operator op add result x y~ result=x+y- 将变量设置为 arifmethics 操作的结果 + - * / …

compiler-construction interpreter bytecode llvm-ir jvm-bytecode

5
推荐指数
0
解决办法
1665
查看次数