Python技术迷

特斯拉工作6年被裁,看看总共拿到多少赔偿

这裁员裁得也太“体面”了点。

网友说自己在特斯拉干了6年,被裁后把账一算,结果不是几万块打发走人,而是七七八八加起来63万多。

主要大头是按N+3走,6年工龄算下来拿了9个月工资,差不多31万多。年假没休完,也按规则折成钱,又是几万。更狠的是股票这块,因为裁员触发了提前归属,当期RSU折成现金直接18万。再加上产线爬坡期留下来的额外奖励,两个月工资又到手7万。

Image

工资、社保、公积金还给缴到5月底,甚至还安排了就业辅导服务。

打工人看到这事,心情就挺复杂。一边羡慕这赔偿确实不难看,一边也扎心:同样是被裁,有人是“结算礼包”,有人是HR一句“明天不用来了”。这差距,真不是一点半点。

算法题:大样本统计
大样本统计,别一上来就把数据塞进 list

内存先炸了,程序才开始报错。

这种题我第一眼不看公式,先看输入规模。只要题面里出现“大样本”“海量数据”“数据量很大”,还让你统计平均值、方差、最大最小值,八成不是考你会不会 sum(arr),而是看你有没有意识到:数据不能全放内存里。

有些写法看着很顺手:

nums = list(map(float, input().split()))
avg = sum(nums) / len(nums)

小样本没毛病。

数据一大,这种代码就开始难看了。输入慢、内存涨、后面还要算方差,又扫一遍数组。题目要是卡得狠一点,直接超内存。

我一般会改成流式统计。

也就是数字来一个处理一个,不攒数组。

比如要统计数量、最大值、最小值、平均值,代码可以这样写:

import sys

defnumbers():
for line in sys.stdin.buffer:
for x in line.split():
yield float(x)

cnt = 0
total = 0.0
max_v = None
min_v = None

for x in numbers():
    cnt += 1
    total += x

if max_v isNoneor x > max_v:
        max_v = x
if min_v isNoneor x < min_v:
        min_v = x

if cnt == 0:
    print("empty")
else:
    print(f"count={cnt}")
    print(f"avg={total / cnt:.6f}")
    print(f"max={max_v:.6f}")
    print(f"min={min_v:.6f}")

这段代码有个点别忽略:用的是 sys.stdin.buffer,不是反复 input()。

很多 Python 算法题,真正慢的不是计算,是读入。尤其一行里塞很多数字的时候,input() 调多了,时间就被吃掉了。

再看方差。

有人会先求平均数,再把所有数减平均数平方求和。问题还是那个:你得保存所有数,或者重新读一遍输入。在线判题里,输入流通常没法倒回去。

这时可以用在线算法,一边读,一边更新平均值和平方差。

import sys

defscan_float():
for row in sys.stdin.buffer:
for item in row.split():
yield float(item)

n = 0
mean = 0.0
m2 = 0.0
lo = None
hi = None

for value in scan_float():
    n += 1

    delta = value - mean
    mean += delta / n
    m2 += delta * (value - mean)

if lo isNoneor value < lo:
        lo = value
if hi isNoneor value > hi:
        hi = value

if n == 0:
    print("empty")
elif n == 1:
    print(f"mean={mean:.6f}")
    print("variance=0.000000")
else:
    variance = m2 / n
    print(f"n={n}")
    print(f"mean={mean:.6f}")
    print(f"variance={variance:.6f}")
    print(f"min={lo:.6f}")
    print(f"max={hi:.6f}")

这地方我不太建议写成一堆公式推导。比赛里没时间欣赏推导,关键是知道 mean 和 m2 怎么滚动更新。

mean 是当前平均值。

m2 记录的是到目前为止,每个数和平均值之间的平方偏差累计量。

新数据进来以后,平均值会变,所以不能简单写成:

m2 += (value - mean) ** 2

这个写法我见过不少次,样例可能能过,数据稍微偏一点就开始错。尤其是大样本,误差会慢慢堆上来。

大样本统计还有一个坑:别乱用整数除法和格式化。

如果题目要求保留 2 位、6 位,最后输出再格式化。中间过程别提前 round(),提前四舍五入就相当于把误差写进程序里,后面样本越多,偏得越明显。

这种题写到最后,其实代码不复杂。

真正要改的是习惯。

别一看到一堆数就 list()。

别一上来就排序。

别为了求个最大最小平均值,把数据在内存里摆一桌。

能扫一遍解决的题,就别扫两遍;能不存的样本,就别存。大样本统计考的不是统计学多深,更多是看你写程序的时候,有没有把输入规模当回事。