Going to second that A* is _not_ good for large applications normally, but if you add distance requirements, it's fine. You never really want to be path-finding to a player when you're not on-screen, anyway (short of some exceptions like maybe bosses.)
Keep in mind that you also want to do checks to see if path-finding is even needed. For example, ranged enemies should first check whether or not they're in range to attack first, and if so, attack the player. If they aren't in range, take the steps needed to become in range (or be in a spot with no obstructions) It's easier to explain than implement sometimes, but there's a lot of information on the internet about the best ways to do this.