我正在尝试使用 Google Drive API v3 和 Python 3 自动上传文件,使它们“公开”并获得可共享的链接,任何人,无论是否登录 Google 帐户,都可以查看和下载(但不能修改) 。
我很接近,但不太明白!观察我的代码。它需要一个名为“testing.txt”的文本文件与脚本位于同一目录中:
from googleapiclient.discovery import build
from httplib2 import Http
from oauth2client import file, client, tools
from apiclient.http import MediaFileUpload
from apiclient import errors
# https://developers.google.com/drive/api/v2/about-auth#requesting_full_drive_scope_during_app_development
SCOPES = 'https://www.googleapis.com/auth/drive' # /sf/answers/2261682531/
# https://developers.google.com/drive/api/v2/reference/permissions/update
def update_permission(service, file_id, permission_id, new_role, type):
"""Update a permission's role.
Args:
service: Drive API service instance.
file_id: ID of the file to update permission for.
permission_id: ID of the permission to update.
new_role: The value 'owner', …Run Code Online (Sandbox Code Playgroud) 我有一个程序,可以迭代 SMB 共享网络驱动器(2TB 三星 970 Evo+)上的数千个 PNG 文件,并将它们各自的文件大小相加。不幸的是,它非常慢。对代码进行分析后,发现 90% 的执行时间都花在一个函数上:
filesize += os.path.getsize(png)
其中每个png变量都是 for 循环中单个 PNG 文件(数千个)的文件路径,该循环遍历从中获取的每个 PNG 文件glob.glob()(相比之下,该文件占执行时间的 7.5%)。
代码可以在这里找到: https: //pastebin.com/SsDCFHLX
显然,通过网络获取文件大小的速度非常慢,但我不确定是什么。有什么方法可以提高性能吗?使用时间也一样长 filesize += os.stat(png).st_size。
当PNG文件存储在本地计算机上时,速度不是问题。当文件存储在我使用千兆位以太网电缆通过本地网络访问的另一台计算机上时,这尤其成为一个问题。两者都运行 Windows 10。
[2022年8月21日更新]
这次我用 10 GB 网络连接再次尝试,发现了一些有趣的事情。我第一次在网络共享上运行代码时,分析器如下所示:
但如果我之后再次运行它,则glob()占用的时间明显减少,而效果getsize()却大致相同:
如果我使用存储在本地 NVMe 驱动器 (WD SN750) 而不是 newtwork 驱动器上的 PNG 文件来运行此代码,则分析器如下所示:
似乎一旦它在网络共享上第二次运行,某些内容就会被缓存,从而允许glob()在网络共享上运行得更快,其速度与在本地 NVMe 驱动器上运行的速度大致相同。但getsize()仍然非常慢,大约是本地速度的 1/10。
有人可以帮助我理解这两点:
getsize()网络共享速度慢很多?有什么办法可以加快速度吗?glob()第一次在网络共享上速度很慢,但之后立即再次运行它时却没有?是否可以使用 ffprobe 或 ffmpeg 来计算视频文件的位深度?我特别想知道我的视频的每通道 (bpc) 有多少位。8 是典型的,但一些更高级的编解码器可以使用更高的位深度,并且我不确定如何使用 ffprobe 获取此信息,或者是否可能。具体来说,我有使用 AVC-Intra Class 100 1080p 59.94 fps 编解码器编码的视频,但我不确定 ffprobe 是否可以从此类文件中获取位深度。如果是这样,你会怎么做?
假设我有两个 numpy 图像数组a和b,尺寸相同,8 位颜色,RGB 格式。现在假设我想生成一个新的 numpy 数组,其像素值是使用“叠加”混合模式组合的前两个数组的像素值。
它的定义,取自维基百科,如下,其中b是顶层,a是底层:
在公式中,我相信a和b是用它们的“白度”来表示的,即全白像素为 1,全黑像素为 0。我不确定色调如何发挥作用。
我不确定除了逐像素迭代两个图像之外是否有更快的方法来做到这一点,这对于 1920x1080 图像来说确实很慢。我需要能够尽快完成这件事。
例如,我设法实现加法混合模式,如下所示:
import numpy as np
import cv2
a = cv2.imread("a.jpg", cv2.IMREAD_UNCHANGED)
b = cv2.imread("b.jpg", cv2.IMREAD_UNCHANGED)
a = a.astype(float)
b = b.astype(float)
ab = a
for i in range(len(ab)):
ab[i] = a[i] + b[i]
cv2.imwrite('Out.png', ab)
Run Code Online (Sandbox Code Playgroud)
它看起来相当快,并且肯定比尝试通过逐像素迭代来实现相同的事情要快得多。但再次强调,这只是加法混合模式,我需要叠加混合模式。
如果您知道任何以 numpy 数组形式实现两个 RGB 图像之间的叠加混合模式的 Python 实现非常高效,请帮我找到它。如果没有,你能尽可能有效地实施它吗?
最近我做了很多网络或 IO 绑定操作,使用线程有助于大大加快代码速度。我注意到我一直在一遍又一遍地编写这样的代码:
threads = []
for machine, user, data in machine_list:
mythread = threading.Thread(target=get_info, args=(machine, user, data))
mythread.start()
threads.append(mythread)
for mythread in threads:
mythread.join()
Run Code Online (Sandbox Code Playgroud)
这感觉有点重复。它有效,但我怀疑可能有一种更“Pythonic”的方式来编写它。有什么建议么?
python ×4
python-3.x ×3
bit-depth ×1
codec ×1
ffmpeg ×1
ffprobe ×1
image ×1
networking ×1
numpy ×1
opencv ×1
performance ×1
permissions ×1
profiling ×1
video ×1
windows ×1