【python语法】python里很抽象的否定运算符not
示例
tta_dataloader = dataloader.DataLoader(
tta_data, batch_size=1, shuffle=True, # shuffle=True,
pin_memory=not args.cpu, num_workers=args.n_threads)
关于这里的pin_memory=not args.cpu:
解释
-
表达式含义
not是 Python 的布尔否定运算符。not args.cpu的结果是布尔值:当args.cpu为 True 时结果为 False,反之当args.cpu为 False 时结果为 True。- 因为在程序中
args.cpu是由argparse的action='store_true'定义的布尔开关(传入--cpu时为 True,默认为 False),所以not args.cpu的直观含义是“不是 CPU 模式” → 即“使用 GPU 时为 True,使用 CPU 时为 False”。
-
在 DataLoader 参数中的作用
pin_memory是 PyTorchDataLoader的一个参数,接受布尔值。pin_memory=True会让DataLoader在返回 batch 前把张量放到“页锁定内存(pinned / page-locked memory)”区域,这样把数据从主内存传输到 GPU(CUDA)时通常更快。- 因此
pin_memory=not args.cpu的目的就是:当程序不在 CPU 模式时(即计划使用 GPU)启用页锁定内存;如果强制只用 CPU,则关闭pin_memory。
-
举例(结果)
- 若命令行带
--cpu→args.cpu == True→not args.cpu == False→pin_memory=False。 - 若不带
--cpu→args.cpu == False→not args.cpu == True→pin_memory=True。
- 若命令行带
-
等价的显式写法
if args.cpu: pin = False else: pin = True tta_dataloader = DataLoader(..., pin_memory=pin)或更简洁:
pin_memory = not args.cpu -
额外建议(更稳健)
- 有时你还想确认 CUDA 是否可用再启用 pin memory:
pin_memory = (not args.cpu) and torch.cuda.is_available() - 若
args.cpu不是布尔(极少见),not会把任意“真值/假值”转换为布尔;不过这里args.cpu应当是布尔,可放心使用。
- 有时你还想确认 CUDA 是否可用再启用 pin memory:
总结:pin_memory=not args.cpu 用来根据命令行开关自动启用/禁用 DataLoader 的页锁定内存 —— 在使用 GPU 时启用(加速主存→GPU 传输),在仅用 CPU 时禁用。

浙公网安备 33010602011771号