Here is my updated script. Notable changes include the use of NEAREST instead of ANTIALIAS, as well as the inclusion of an EXIF copy and paste. I think the major hang on the original script was the inefficiency of ANTIALIAS, as this script gives me around 95% compression in about 2 seconds per image.
from PIL import Image
from pathlib import Path
import os, sys
import glob
root_dir = "/.../"
basewidth = 5504 #sets base width of new images
for filename in glob.iglob(root_dir + '*.jpg', recursive=True): #creates for loop to refeence all .jpg files in root directory
p = Path(filename) #converts filename into Path object
img = p.relative_to(root_dir) #uses Path function to parse out Path into components, then uses all components following that equal to the root_dir path name (in this case, our jpeg file names)
new_name = (root_dir + 'compressed/' + str(img)) #creates new path to save compressed files to in subfolder "compressed" (note: must create subfolder before running)
print(new_name)
#resize and reduce
im = Image.open(filename) #sets filename as object
wpercent = (basewidth/float(im.size[0])) #uses the base width to establish aspect ratio
hsize = int((float(im.size[1])*float(wpercent))) #scales image height using aspect ratio
im = im.resize((basewidth,hsize), Image.NEAREST) #sets new resolution using basewidth and hsize
exif = im.info['exif'] #copy EXIF data
im.save(new_name, 'JPEG', exif = exif, quality=40)